【问题标题】:Search crashes when random characters '%^$^&%'? [duplicate]随机字符“%^$^&%”时搜索崩溃? [复制]
【发布时间】:2013-07-19 06:46:32
【问题描述】:

各位程序员们下午好,我在这里遇到了一个错误。当我输入如下随机字符时,您会看到我的搜索崩溃:%^&*&%。这是错误以及搜索代码,请参见下文:

“/”应用程序中的服务器错误。

Like 运算符出错:字符串模式 '%$%^$&^%' 无效。

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.Data.EvaluateException:Like 中的错误 运算符:字符串模式 '%$%^$&^%' 无效。

来源错误:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[EvaluateException:Like 运算符中的错误:字符串模式 '%$%^$&^%' 无效。] System.Data.LikeNode.AnalyzePattern(String 拍)+1277726 System.Data.LikeNode.Eval(DataRow 行,DataRowVersion 版本)+341 System.Data.BinaryNode.Eval(ExpressionNode expr, DataRow 行,DataRowVersion 版本,Int32[] recordNos) +20
System.Data.BinaryNode.EvalBinaryOp(Int32 op, ExpressionNode left, ExpressionNode 右,DataRow 行,DataRowVersion 版本,Int32[] recordNos) +12960 System.Data.BinaryNode.Eval(DataRow 行, DataRowVersion 版本)+25
System.Data.BinaryNode.Eval(ExpressionNode expr,DataRow 行, DataRowVersion 版本,Int32[] recordNos) +20
System.Data.BinaryNode.EvalBinaryOp(Int32 op, ExpressionNode left, ExpressionNode 右,DataRow 行,DataRowVersion 版本,Int32[] recordNos) +12960 System.Data.BinaryNode.Eval(DataRow 行, DataRowVersion 版本)+25
System.Data.BinaryNode.Eval(ExpressionNode expr,DataRow 行, DataRowVersion 版本,Int32[] recordNos) +20
System.Data.BinaryNode.EvalBinaryOp(Int32 op, ExpressionNode left, ExpressionNode 右,DataRow 行,DataRowVersion 版本,Int32[] recordNos) +12960 System.Data.BinaryNode.Eval(DataRow 行, DataRowVersion 版本)+25
System.Data.BinaryNode.Eval(ExpressionNode expr,DataRow 行, DataRowVersion 版本,Int32[] recordNos) +20
System.Data.BinaryNode.EvalBinaryOp(Int32 op, ExpressionNode left, ExpressionNode 右,DataRow 行,DataRowVersion 版本,Int32[] recordNos) +12960 System.Data.BinaryNode.Eval(DataRow 行, DataRowVersion 版本)+25
System.Data.BinaryNode.Eval(ExpressionNode expr,DataRow 行, DataRowVersion 版本,Int32[] recordNos) +20
System.Data.BinaryNode.EvalBinaryOp(Int32 op, ExpressionNode left, ExpressionNode 右,DataRow 行,DataRowVersion 版本,Int32[] recordNos) +12960 System.Data.BinaryNode.Eval(DataRow 行, DataRowVersion 版本)+25
System.Data.DataExpression.Invoke(DataRow 行,DataRowVersion 版本) +145 System.Data.Index.AcceptRecord(Int32 record, IFilter filter) +101 System.Data.Index.InitRecords(IFilter filter) +297 System.Data.Index..ctor(DataTable table, IndexField[] indexFields, 比较`1比较,DataViewRowState recordStates,IFilter rowFilter) +464 System.Data.DataTable.GetIndex(IndexField[] indexDesc,DataViewRowState 记录状态,IFilter 行过滤器)+212
System.Data.DataView.UpdateIndex(布尔力,布尔fireEvent) +159 System.Data.DataView.UpdateIndex(布尔力) +12 System.Data.DataView.SetIndex2(String newSort, DataViewRowState newRowStates, IFilter newRowFilter, Boolean fireEvent) +108
System.Data.DataView.SetIndex(字符串 newSort,DataViewRowState newRowStates, IFilter newRowFilter) +14
System.Data.DataView.set_RowFilter(字符串值) +158
System.Web.UI.WebControls.FilteredDataSetHelper.CreateFilteredDataView(数据表 表、字符串 sortExpression、字符串 filterExpression、IDictionary 过滤器参数)+387
System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(DataSourceSelectArguments 论据)+1830
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments 参数,DataSourceViewSelectCallback 回调)+21
System.Web.UI.WebControls.DataBoundControl.PerformSelect() +138
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +30
System.Web.UI.WebControls.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

代码是:

 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。除了避免错误之外,您还将避免 SQL 注入漏洞。一个例子见这里:stackoverflow.com/questions/4387300

标签: c# html asp.net sql


【解决方案1】:

现在您的代码容易受到 SQL 注入攻击。

切换到使用参数化查询,我怀疑它会解决您的问题(以及修复您现在拥有的巨大安全漏洞......)。我猜当您提交“随机字符”时,有些值没有被正确转义。

Here is an excellent link 让您开始使用参数化查询。

【讨论】:

  • 请不要提这个重复频率太高的问题。
  • SelectCommand="SELECT [PlayerID], [Nickname], [UserName], [ClubNumber], [FirstName], [Email], [LastName], [DOB] FROM [Players] where Nickname like '%'+@Nickname+'%' order by lastname ASC"> asp:SqlDataSource>
  • 以上评论使用您的解决方案@Abe 解决了我的问题。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 2013-08-23
  • 2013-04-21
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多