При поиске случайных символов "% ^ $ ^ &%" происходит сбой?

Добрый день, товарищи, программисты, здесь я столкнулся с ошибкой. Вы видите, что мой поиск завершается сбоем, когда я ввожу случайные символы, например следующие:% ^ & * &%. Вот ошибка и код поиска, см. Ниже:

Ошибка сервера в приложении '/'

Ошибка в операторе Like: шаблон строки "% $% ^ $ & ^%" недействителен.

Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительных сведений об ошибке и ее происхождении в коде.

Сведения об исключении: System.Data.EvaluateException: ошибка в операторе Like: шаблон строки "% $% ^ $ & ^%" недействителен.

Ошибка источника:

Необработанное исключение было создано во время выполнения текущего веб-запроса. Информацию о происхождении и местонахождении исключения можно определить с помощью трассировки стека исключений ниже.

Трассировки стека:

И код такой:

введите описание изображения здесь

 public static bool IsDate(Object obj)
        {
            string strDate = obj.ToString();
            try
            {
                DateTime dt = DateTime.Parse(strDate);
                if (dt != DateTime.MinValue && dt != DateTime.MaxValue)
                    return true;
                return false;
            }
            catch
            {
                return false;
            }
        }


 protected void BtnWinnersSearch_Click(object sender, EventArgs e)
        {

            string searchText = txtWinnersSearch.Text.Replace("'", "''").Trim();
            bool isDate = IsDate(searchText);

            GridViewWinners.Visible = true;

            if (isDate == true)
            {
                SqlDataSource4.FilterExpression = "dob" + " ='" + Convert.ToDateTime(searchText).ToString("yyyy-MM-dd") + "'";
            }
            else
            {
                SqlDataSource4.FilterExpression = "nickname like '%" + searchText + "%' or username like '%" + searchText +
                    "%' or clubnumber like '%" + searchText + "%' or firstname like '%" +
                    searchText + "%' or lastname like '%" + searchText +
                    "%' or email like '%" + searchText + "%'";
            }
        }

Прямо сейчас ваш код уязвим для атаки с использованием SQL-инъекции.


person Christopher    schedule 19.07.2013    source источник
comment
Пожалуйста, не задавайте этот слишком часто повторяющийся вопрос.   -  person Paul Sasik    schedule 20.07.2013


Ответы (1)


Переключитесь на использование параметризованных запросов, и я подозреваю, что это решит вашу проблему (а также исправит огромную уязвимость безопасности, которая у вас есть прямо сейчас ...). Я предполагаю, что есть какое-то значение, которое не экранируется должным образом, когда вы отправляете "случайные символы".

Вот отличный ссылку, чтобы начать работу с параметризованными запросами.

Форма этого вопроса / проблемы возникает на SO почти ежедневно. Ответ: Используйте параметры вместо динамической генерации вашего SQL. Помимо предотвращения ошибок, вы также избежите уязвимости SQL-инъекций. См. Здесь один пример: stackoverflow.com/questions/4387300

person Abe Miessler    schedule 19.07.2013
comment
SelectCommand = SELECT [PlayerID], [Nickname], [UserName], [ClubNumber], [FirstName], [Email], [LastName], [DOB] FROM [Players], где псевдоним вроде '%' + @ Nickname + '%' упорядочить по фамилии ASC ›‹SelectParameters›‹ asp: ControlParameter ControlID = txtWinnersSearch Name = Псевдоним PropertyName = Text Type = String / ›‹/SelectParameters›‹ / asp: SqlDataSource › - person Paul Sasik; 20.07.2013
comment
Приведенный выше комментарий решил мою проблему с помощью вашего решения @Abe. еще раз спасибо! - person Christopher; 23.07.2013
comment
[EvaluateException: Ошибка в операторе Like: шаблон строки '% $% ^ $ & ^%' недействителен.] System.Data.LikeNode.AnalyzePattern (String pat) +1277726 System.Data.LikeNode.Eval (строка DataRow, DataRowVersion версия) +341 System.Data.BinaryNode.Eval (выражение ExpressionNode, строка DataRow, версия DataRowVersion, Int32 [] recordNos) +20
System.Data.BinaryNode.EvalBinaryOp (Int32 op, ExpressionNode слева, ExpressionNode справа, строка DataRow , Версия DataRowVersion, Int32 [] recordNos) +12960 System.Data.BinaryNode.Eval (строка DataRow, версия DataRowVersion) +25
System.Data.BinaryNode.Eval (выражение ExpressionNode, строка DataRow, версия DataRowVersion, Int32 [] recordNos) +20
System.Data.BinaryNode.EvalBinaryOp (Int32 op, ExpressionNode left, ExpressionNode right, DataRow row, DataRowVersion version, Int32 [] recordNos) +12960 System.Data.BinaryNode.Eval (DataRow row, DataRowVersion version ) +25
System.Data.BinaryNode.Eval (ExpressionNode expr, строка DataRow, Dat aRowVersion version, Int32 [] recordNos) +20
System.Data.BinaryNode.EvalBinaryOp (Int32 op, ExpressionNode left, ExpressionNode right, DataRow row, DataRowVersion version, Int32 [] recordNos) +12960 System.Data.BinaryNode.Eval (Строка DataRow, версия DataRowVersion) +25
System.Data.BinaryNode.Eval (выражение ExpressionNode, строка DataRow, версия DataRowVersion, Int32 [] recordNos) +20
System.Data.BinaryNode.EvalBinaryOp (Int32 op, ExpressionNode слева, ExpressionNode справа, строка DataRow, версия DataRowVersion, Int32 [] recordNos) +12960 System.Data.BinaryNode.Eval (строка DataRow, версия DataRowVersion) +25
System.Data.BinaryNode.Eval (выражение ExpressionNode, DataRow row, DataRowVersion version, Int32 [] recordNos) +20
System.Data.BinaryNode.EvalBinaryOp (Int32 op, ExpressionNode left, ExpressionNode right, DataRow row, DataRowVersion version, Int32 [] recordNos) +12960 System.Data.BinaryNode .Eval (строка DataRow, версия DataRowVersion) +25
System.D ata.DataExpression.Invoke (строка DataRow, версия DataRowVersion) +145 System.Data.Index.AcceptRecord (запись Int32, фильтр IFilter) +101 System.Data.Index.InitRecords (фильтр IFilter) +297 System.Data.Index .. ctor (таблица DataTable, IndexField [] indexFields, сравнение Comparison`1, DataViewRowState recordStates, IFilter rowFilter) +464 System.Data.DataTable.GetIndex (IndexField [] indexDesc, DataViewRowState recordStates, IFilter rowFilter) +212
System. Data.DataView.UpdateIndex (Boolean force, Boolean fireEvent) +159 System.Data.DataView.UpdateIndex (Boolean force) +12 System.Data.DataView.SetIndex2 (String newSort, DataViewRowState newRowStates, IFilter newRowFilter, +108 fireEvent) br> System.Data.DataView.SetIndex (String newSort, DataViewRowState newRowStates, IFilter newRowFilter) +14
System.Data.DataView.set_RowFilter (строковое значение) +158
System.Web.UI.WebControls.FilteredDataSetHelper. CreateFilteredDataView (таблица DataTable, String sortExpression, String filterExpression, IDictionary filterParameters) +387
System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect (аргументы DataSourceSelectArguments) +1830
System.Web.UI.DataSourceView.SelectAr (DataSourceView.SelectAr аргументы, обратный вызов DataSourceViewSelectCallback) +21
System.Web.UI.WebControls.DataBoundControl.PerformSelect () +138
System.Web.UI.WebControls.BaseDataBoundControl.DataBind () +30
System.Web. UI.WebCon trols.GridView.DataBind () +4
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound () +105 System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls () +75 System.Web.UI.Control. EnsureChildControls () +83 System.Web.UI.Control.PreRenderRecursiveInternal () +42
System.Web.UI.Control.PreRenderRecursiveInternal () +168
System.Web.UI.Control.PreRenderRecursiveInternal () +168
System.Web.UI.Control.PreRenderRecursiveInternal () +168
System.Web.UI.Control.PreRenderRecursiveInternal () +168
System.Web.UI.Control.PreRenderRecursiveInternal () +168
System.Web.UI.Page.ProcessRequestMain (логическое includeStagesBeforeAsyncPoint, логическое includeStagesAfterAsyncPoint) +974 - person Christopher; 23.07.2013