使用正则表达式来防止SQL注入攻击

本文介绍使用正则表达式验证用户输入以防止SQL注入的方法。通过设置正则表达式作为白名单,可以有效过滤非法字符,确保输入合法性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只要几个字符就能防SQL注入——正则表达式

 

 前天朋友的网站被SQL挂马了,好惨,整个数据库不能用了。因为里面全是脚本。网站崩溃……

 

      今儿他总算是把数据库还原完事了(还好有急时备份),之后打电话和我说了这事儿。忍不住建意他在所有有用户输入的地方进行验证,引用一句名言:“所有输入都是罪恶的”……

 

      关于防注入,是很平常的话题了,最常见也最简单的办法,就是replace,把你不想要的字符串换掉。有些ASP程序员干脆把这些操做做成一个文件,然后在页面最上面include一下,检查request里所有的这字段,样只要有注入嫌疑,直接踢飞。.net下更容易一些,因为C#要比VBS强得多,还有.net做后盾。但我所见过的代码里,绝大多数还是靠string类里的几个方法来防注入。

 

      这种方法几呼所有人都用过,但缺点也非常明显。那就是费事!你想去掉哪个字符,就得replace一下,有时要嵌套好几层,搞得自己都眼花。

 

      简单的说一下为什么说用替换方法来防注入不好吧。

      刚才说过了,你不想要什么字符,就得明确的把这个字符写出来替换或是找到,然后再处理。其实这是一种“黑名单”方式,你不想谁进来,就得明确写出是谁。黑名单方法前题是你明确的知道你想拒决谁,但事实上往往不是这样,你也不知道哪个来了是不安全的。特别是很多程序员对SQL技术并不了解,我本人也只是知道一点皮毛,只是够用而以。也就是说很可能你并不知道人家会用什么语句来注入。

 

      “黑名单”不好,那还有别的办法吗?有,很明显,它就是“白名单”。其实在计算机网中很多地方使用的安全方式都是“白名单”。像某些路由器,只有认识的IP发进来的信息它才会转发,不认识的直接否掉。如果它是以“黑名单”方式工作,那就苦了,算一下吧,天下IP地址有多少……。“白名单”方式只允许认识的人进来,不认识的直接否掉。

 

      现在我们说到正题“正则表达式”,它正好给我们提供了一种非常方便的实现白名单方式的途径。只需要一个设计好的自符串,它就能帮我们确认用户输入的是不是舍法的信息,而不需要你去一个又一个的replace。

 

      比如我要验证URL里GET过来的ID是不是合法的数值,我只需要设定一个非常简短的正则表达式:"^[0-9]+$ ".这个表达式要求被验证的字符串长度至少为1,并且由0到9组成,也就是说它是一个正整数。一般我们文章页使用的ID都是一个由自增字段生成的整数,那么这个正则正好能验证它。接下来我们只要建立一个方法,如我写的这个:

        static public bool IsInt(string Str)
        {
            Regex RegStr = new Regex("^[0-9]+$ ");
            return RegStr.IsMatch(Str);
        }

        每次在有整数输入的地方调用它,就可以确认用户输入是否合法了。就算用户恶意输入一个错误的由整数构成的ID,最多程序出错,不可能对你造成什么注入攻击。

 

 

同上面方法一样,把表达式换成:"^[0-9A-Za-z_]+$ ",就可以验证目标字符串是不是一个舍法的用户名,因为组成用户名的也就是这个表达式里所指定的字符。像“  '  ”、“!”、“-”和空格这样注入攻击中常见的字符是逃不过正则表达式的法眼的。

 

 

其实正规还可以做很多事情,本人目前也只是知道点皮毛,但发现它真的好用。其实动易等很多CMS程序在模板标签替换中都是使用的正则表达式实现的。

 

以上内容,有说错和不足的地方请路过的朋友指出来,我也好改正……

 

其实这是写给我那朋友看的。。 。。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值