防SQL注入正则表达式的方法(菜鸟级可用)
SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。
但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。
最容易忽略的问题就是SQL注入漏洞的问题。用NBSI 2.0对网上的一些ASP网站稍加扫描,就能发现许多ASP网站存在SQL注入漏洞,教育网里高校内部机构的一些网站这种漏洞就更普遍了,可能这是因为这 些网站大都是一些学生做的缘故吧,虽然个个都很聪明,可是毕竟没有经验,而且处于学习中,难免漏洞多多了。本文主要讲讲SQL注入的防范措施,而要明白这 些防范措施的用处,须先详细讲解利用SQL注入漏洞入侵的过程。新手们看明白啦。
相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。如这是一个正常的网址http://localhost/lawjia/show.asp?ID=444,将这个网址提交到服务器后,服务器将进行类似Select * from 表名 where 字段="&ID的查询(ID即客户端提交的参数,本例是即444),再将查询结果返回给客户端,如果这里客户端故意提交这么一个网址:
http://localhost/lawjia/show.asp?ID=444 and user>0,这时,服务器运行Select * from 表名 where 字段=444 and user>0这样的查询,当然,这个语句是运行不下去的,肯定出错,错误信息如下:
·错误类型:
Microsoft OLE DB Provider for ODBC Drivers
(0x80040E07)
[Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar
值 'sonybb' 转换为数据类型为 int 的列时发生语法错误。
/lawjia/show.asp, 第 47 行
但是别有用心的人从这个出错信息中,可以获得以下信息:该站使用MS_SQL数据库,用ODBC连接,连接帐号名为:sonybb。所谓SQL注入
(SQL
Injection),就是利用程序员对用户输入数据的合法性检测不严或不检测的特点,故意从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获
取想得到的资料。通常别有用心者的目标是获取网站管理员的帐号和密码。比如当某个人知道网站管理员帐号存在表login中,管理员帐号名为admin,他
想知道管理员密码,这里他从客户端接着提交这样一个网址:
http://localhost/lawjia/show.asp?ID=444 and (Select password
from login where user_name='admin')>0,返回的出错信息如下:
·错误类型:
Microsoft OLE DB Provider for ODBC Drivers
(0x80040E07)
[Microsoft][ODBC SQL Server Driver][SQL Server]将 varchar
值 '!@#*&admin' 转换为数据类型为 int 的列时发生语法错误。
/lawjia/show.asp, 第 47 行
你知道吗?上面标红的部分就是管理员帐号admin的密码!虽然很复杂,让人看几遍也记不住的,但它就这样显示在你面前了,这时您就可以用这个帐号和密 码接管人家的网站了!这时你可能还会说,如果他不是事先知道管理员帐号存在表login中,而且知道管理员帐号为admin,那他就不可能获得管理员密 码。你错了,只要人家愿意多花时间尝试,他将可以获得数据库连接帐号权限内所能获得的所有信息!具体过程请参看网上的这篇文章:SQL注入漏洞全接触。
先了解到这里。针对我的项目需求我写了一个非常简单的正则表达式来进行过滤。代码如下:
2 {
3 Regex rx = new Regex(@"^([0-9])$"); 全部都是数字的正则
4 if (rx.IsMatch(str)) //判断传进来的值是否匹配正则表达式
5 {
6 return true; //匹配返回true
7 }
8 else
9 {
10 return false; //否则返回false
11 }
12 }
在网上找了一些感觉都比我这好多多的。
2 { string[] Lawlesses={"=","'"};
3 if(Lawlesses==null||Lawlesses.Length<=0)return true; //构造正则表达式,例:Lawlesses是=号和'号,则正则表达式为 .*[=}'].* (正则表达式相关内容请见MSDN) 另外,由于我是想做通用而且容易修改的函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式亦可;
5 string str_Regex=".*[";
6 for(int i=0;i< Lawlesses.Length-1;i++)
7 str_Regex+=Lawlesses[i]+"|";
8 str_Regex+=Lawlesses[Lawlesses.Length-1]+"].*";
9 // foreach(object arg in args)
10 { if(arg is string)//如果是字符串,直接检查
11 { if(Regex.Matches(arg.ToString(),str_Regex).Count>0)
12 return false; }
13 else if(arg is ICollection)//如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查 { foreach(object obj in (ICollection)arg)
14 { if(obj is string)
15 { if(Regex.Matches(obj.ToString(),str_Regex).Count>0)
16 return false;
17 }
18 }
19 }
20 }
21 return true;}

浙公网安备 33010602011771号