CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

防SQL注入的正则表达式!帮忙改一下错!

楼主swazn_yj(菩提本无树)2006-04-24 15:11:27 在 .NET技术 / C# 提问

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

1 楼dutguoyi(新鲜鱼排)回复于 2006-04-24 15:36:35 得分 5

正则不是很懂。  
  还是分开考虑吧。Top

2 楼swazn_yj(菩提本无树)回复于 2006-04-24 16:37:06 得分 0

up!!Top

3 楼zhoujijunnt(---)回复于 2006-04-24 16:50:59 得分 5

顶!Top

4 楼iversonkai(玉凯的困惑)回复于 2006-04-24 16:54:21 得分 10

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

5 楼ocan(OK! I Can!!!)回复于 2006-04-24 16:55:06 得分 5

@Top

6 楼jedliu(21世纪什么最贵? 人才!)回复于 2006-04-24 17:43:48 得分 10

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

7 楼yuanarea(Sail before)回复于 2006-04-24 18:11:01 得分 10

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

8 楼RUN_(奔跑)回复于 2006-04-24 18:13:42 得分 5

upTop

9 楼swazn_yj(菩提本无树)回复于 2006-04-25 15:49:54 得分 0

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

10 楼swazn_yj(菩提本无树)回复于 2006-04-25 15:52:13 得分 0

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不匹配!我晕死!  
  Top

11 楼Matthewzhong()回复于 2006-04-25 15:59:03 得分 5

用Parameter传值可以避免SQL注入Top

12 楼swazn_yj(菩提本无树)回复于 2006-04-25 16:14:31 得分 0

我是想用正则表达式验证一下!Top

13 楼swazn_yj(菩提本无树)回复于 2006-04-26 09:54:49 得分 0

这个问题我倒没有碰到过,我和楼主也一起学习一下,帮楼主关注并up一下。Top

14 楼swazn_yj(菩提本无树)回复于 2006-04-26 10:23:52 得分 0

up!!!Top

15 楼xrascal(横刀夺爱)回复于 2006-04-26 10:48:05 得分 5

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

16 楼lovvver(ElephantTalk.Bright)回复于 2006-04-26 10:50:01 得分 10

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

17 楼swazn_yj(菩提本无树)回复于 2006-04-26 10:53:52 得分 0

up!!!  
  Top

18 楼xiaomatian(趴趴熊◎%#……※×)回复于 2006-04-26 14:41:16 得分 2

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

19 楼swazn_yj(菩提本无树)回复于 2006-04-26 14:54:56 得分 0

up!!Top

20 楼swazn_yj(菩提本无树)回复于 2006-04-27 08:25:31 得分 0

up!!  
  Top

21 楼swazn_yj(菩提本无树)回复于 2006-04-29 10:56:07 得分 0

up!Top

22 楼boyyao(迷失在网络 (问题不解答扣分也不结贴!))回复于 2006-05-04 22:55:00 得分 2

makeTop

23 楼webwait(webwei)回复于 2006-05-04 23:18:06 得分 2

markTop

24 楼san12655874(小三33)回复于 2006-05-04 23:48:24 得分 2

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

25 楼yuanarea(Sail before)回复于 2006-05-05 02:26:33 得分 5

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

26 楼swazn_yj(菩提本无树)回复于 2006-05-06 18:19:17 得分 0

up!Top

27 楼Radar2006(中华英雄)回复于 2006-05-06 18:31:14 得分 2

mark   and   up!Top

28 楼radio_3000(学习中……)回复于 2006-05-08 11:01:38 得分 2

关注一下,注入还是很疯狂的。Top

29 楼wangzhenyun_512(explorer)回复于 2006-05-08 11:32:27 得分 5

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

30 楼swazn_yj(菩提本无树)回复于 2006-05-10 08:58:38 得分 0

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不匹配!我晕死!Top

31 楼careast(雅)回复于 2006-05-10 09:03:35 得分 2

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

32 楼careast(雅)回复于 2006-05-10 09:09:18 得分 0

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

33 楼abandonship(焚酒煮剑)回复于 2006-05-10 09:26:45 得分 2

把报的错误贴出来看看Top

34 楼swazn_yj(菩提本无树)回复于 2006-05-10 09:33:46 得分 0

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

35 楼junzhang4008(程序可以让尸体动起来)回复于 2006-05-10 09:38:47 得分 2

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

36 楼hyena041(陷入自己的思维中,找不到自己了)回复于 2006-05-10 09:48:15 得分 2

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

37 楼swazn_yj(菩提本无树)回复于 2006-05-10 14:57:43 得分 0

up!Top

相关问题

关键词

得分解答快速导航

  • 帖主:swazn_yj
  • dutguoyi
  • zhoujijunnt
  • iversonkai
  • ocan
  • jedliu
  • yuanarea
  • RUN_
  • Matthewzhong
  • xrascal
  • lovvver
  • xiaomatian
  • boyyao
  • webwait
  • san12655874
  • yuanarea
  • Radar2006
  • radio_3000
  • wangzhenyun_512
  • careast
  • abandonship
  • junzhang4008
  • hyena041

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo