Regex knownBad = new Regex("^?;\;\--|d(?:elete\sfrom|rop\stable)|insert\sintols(?:elect\s\*|p_)|union\sselect|xp_$");
        if(knowBad.IsMatch(InputStr))
        {        }
        else
        {        }上面那个表达式是从书上抄来的,怎么也编译不过去,说无法转义的字符,哪位大哥帮忙调试一下!

解决方案 »

  1.   

    new Regex(@"^?;\;\--|d(?:elete\sfrom|rop\stable)|insert\sintols(?:elect\s\*|p_)|union\sselect|xp_$");
    在表达式的“” 前加个 @  就好了
      

  2.   

    看不懂,给你几条得了
    检测SQL meta-characters的正则表达式 /((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3B)|(:))/iUNION查询关键字的正则表达式/((\%27)|(\'))union/ix/exec(\s|\+)+(s|x)p\w+/ix这几条配合使用比较好
      

  3.   

    防SQL注入,我的做法很简单:就是永远都支持 ' 这个单引号, 如果发现 ' (写不到数据库),我就加一个配对,成为 '' (可以写入数据库),其他一概不管这样的方法不知道能注射不?
      

  4.   

    To:yuanarea(基于遗传基因、面向女朋友的开发方式) ,这样也不保险!
      

  5.   

    public string Input_safe(string InputStr, int StrLen, int ParaType)
        {
              //InputStr输入的字符,StrLen限制字符的长度,ParaType字符类型,1为字符型,0为数字!
            if (InputStr.Length > StrLen)
            {
                Response.Redirect("Err.aspx?Msg=非法输入1");            
            }         if (ParaType == 1)
             {
                Regex reg = new Regex(@"^?;\;\--|d(?:elete\sfrom|rop\stable)|insert\sintols(?:elect\s\*|p_)|union\sselect|xp_$");
                if (reg.IsMatch(InputStr))
                {
                    //Response.Redirect("Err.aspx?Msg=非法输入3");
                    Response.Write(InputStr + "字符!<br>");
                    Response.End();            }
                else
                {
                    return InputStr;
                } 
             }
             else
             {
                 try
                 {
                     int fData;
                     fData = int.Parse(InputStr);
                 }
                 catch (FormatException)
                 {
                     //Response.Redirect("Err.aspx?Msg=非法输入2");
                     Response.Write(InputStr + "数字!<br>");
                     Response.End();
                 }
                 Regex reg = new Regex(@"^\d{1," + StrLen + "}$");
                 Response.Write(reg + "<br>");
                 if (reg.IsMatch(InputStr))
                 {
                     //Response.Redirect("Err.aspx?Msg=非法输入3");
                     Response.Write(InputStr + "不匹配!<br>");
                     Response.End();
                 }
                 else
                 {
                     return InputStr;
                 } 
             }         return InputStr;
      
          
        }这个当字符是数字的时候不能正确验证,哪位大哥帮忙看看!
    ^\d{1,6}$跟11不匹配!我晕死!
      

  6.   

    用Parameter传值可以避免SQL注入
      

  7.   

    最好的防sql注入的方式应该是使用sql语句参数形式
      

  8.   

    注入攻击,很好解决。
    其攻击的方式都很简单。
    你在写sql语句的时候,加上一个字符,如:
    select 1 from sys_user where '['+username+']'='['+@username+']' and password=@pwdusername = '[' or ''=']':是不能为真的
      

  9.   

    呵呵.我都是用Parameter,然后prepare一下.
      

  10.   

    yuanarea(基于遗传基因、面向女朋友的开发方式) :
    如果我用2个 '呢?
      

  11.   

    ....
    我的意思是,发现一个就变成两个,呵呵,永远让 '保持双数出现,你用两个'
    我过滤后就变成 4个了,你用3个‘ 过滤后成6个参考如下代码:欢迎大家攻击测试
    foreach (char c in SQL_STRING)
    if (c=='\'')
        result += "''";
    else
        result += c;
      

  12.   

    加@如下
    Regex knownBad = new Regex(@"^?;\;\--|d(?:elete\sfrom|rop\stable)|insert\sintols(?:elect\s\*|p_)|union\sselect|xp_$");
      

  13.   

    public string Input_safe(string InputStr, int StrLen, int ParaType)
        {
              //InputStr输入的字符,StrLen限制字符的长度,ParaType字符类型,1为字符型,0为数字!
            if (InputStr.Length > StrLen)
            {
                Response.Redirect("Err.aspx?Msg=非法输入1");            
            }         if (ParaType == 1)
             {
                Regex reg = new Regex(@"^?;\;\--|d(?:elete\sfrom|rop\stable)|insert\sintols(?:elect\s\*|p_)|union\sselect|xp_$");
                if (reg.IsMatch(InputStr))
                {
                    //Response.Redirect("Err.aspx?Msg=非法输入3");
                    Response.Write(InputStr + "字符!<br/>");
                    Response.End();            }
                else
                {
                    return InputStr;
                } 
             }
             else
             {
                 try
                 {
                     int fData;
                     fData = int.Parse(InputStr);
                 }
                 catch (FormatException)
                 {
                     //Response.Redirect("Err.aspx?Msg=非法输入2");
                     Response.Write(InputStr + "数字!<br/>");
                     Response.End();
                 }
                 Regex reg = new Regex(@"^\d{1," + StrLen + "}$");
                 Response.Write(reg + "<br/>");
                 if (reg.IsMatch(InputStr))
                 {
                     //Response.Redirect("Err.aspx?Msg=非法输入3");
                     Response.Write(InputStr + "不匹配!<br/>");
                     Response.End();
                 }
                 else
                 {
                     return InputStr;
                 } 
             }         return InputStr;
      
          
        }这个当字符是数字的时候不能正确验证,哪位大哥帮忙看看!
    ^\d{1,6}$跟11不匹配!我晕死!
      

  14.   

    To:
     jedliu(21世纪什么最贵? 人才!) 
      

  15.   

    不小心提交了,不好意思!To:
     jedliu(21世纪什么最贵? 人才!) :你说的方法,该如何配合使用?能不能举个例子?
      

  16.   

    没报错误,就是我如果输入的参数(string InputStr, int StrLen, int ParaType)
    ParaType=1,也就是说检查字符型的时候第一个正则表达式没问题,问题是我如果ParaType=0的时候,第二个正则表达式就不起作用,^\d{1,6}$跟11不匹配!,这个正则是判断1,6位整数的,11都通不过!
      

  17.   

    username=username.Replace("'","");
    userpassword=userpassword.Replace("'","");
    ...
    把非法字符替换为空
      

  18.   

    加@符号
    防止字符转义对于防止sql注入,其实还是使用command对象的参数进行参数传入