只要几个字符就能防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程序在模板标签替换中都是使用的正则表达式实现的。
以上内容,有说错和不足的地方请路过的朋友指出来,我也好改正……
其实这是写给我那朋友看的。。 。。