当随机字符'%^ $ ^&%'时搜索崩溃?

时间:2013-07-19 20:51:40

标签: c# html asp.net sql

下午好的编码员,我在这里遇到了错误。当我输入以下随机字符时,您会看到我的搜索崩溃:%^& *&%。以下是错误以及搜索代码,请参阅以下内容:

  

' /'中的服务器错误应用

     

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

     

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

     

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

     

来源错误:

     

执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

     

堆栈追踪:

     

[EvaluateException:Like运算符出错:字符串模式   '%$%^ $&放大器; ^%'无效。] System.Data.LikeNode.AnalyzePattern(String   pat)+1277726 System.Data.LikeNode.Eval(DataRow row,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 row,   DataRowVersion版)+25
  System.Data.BinaryNode.Eval(ExpressionNode expr,DataRow row,   DataRowVersion版本,Int32 [] recordNos)+20
  System.Data.BinaryNode.EvalBinaryOp(Int32 op,ExpressionNode left,   ExpressionNode对,DataRow行,DataRowVersion版本,Int32 []   recordNos)+12960 System.Data.BinaryNode.Eval(DataRow row,   DataRowVersion版)+25
  System.Data.BinaryNode.Eval(ExpressionNode expr,DataRow row,   DataRowVersion版本,Int32 [] recordNos)+20
  System.Data.BinaryNode.EvalBinaryOp(Int32 op,ExpressionNode left,   ExpressionNode对,DataRow行,DataRowVersion版本,Int32 []   recordNos)+12960 System.Data.BinaryNode.Eval(DataRow row,   DataRowVersion版)+25
  System.Data.BinaryNode.Eval(ExpressionNode expr,DataRow row,   DataRowVersion版本,Int32 [] recordNos)+20
  System.Data.BinaryNode.EvalBinaryOp(Int32 op,ExpressionNode left,   ExpressionNode对,DataRow行,DataRowVersion版本,Int32 []   recordNos)+12960 System.Data.BinaryNode.Eval(DataRow row,   DataRowVersion版)+25
  System.Data.BinaryNode.Eval(ExpressionNode expr,DataRow row,   DataRowVersion版本,Int32 [] recordNos)+20
  System.Data.BinaryNode.EvalBinaryOp(Int32 op,ExpressionNode left,   ExpressionNode对,DataRow行,DataRowVersion版本,Int32 []   recordNos)+12960 System.Data.BinaryNode.Eval(DataRow row,   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 recordStates,IFilter rowFilter)+221
  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(String newSort,DataViewRowState   newRowStates,IFilter newRowFilter)+14
  System.Data.DataView.set_RowFilter(String value)+158
  System.Web.UI.WebControls.FilteredDataSetHelper.CreateFilteredDataView(数据表   table,String sortExpression,String filterExpression,IDictionary   filterParameters)+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 8   System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8   System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8   System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8   System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8   System.Web.UI.Page.ProcessRequestMain(布尔   includeStagesBeforeAsyncPoint,Boolean 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 + "%'";
            }
        }

enter image description here

1 个答案:

答案 0 :(得分:2)

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

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

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