通用分页存储过程真的有注入漏洞吗?
2009-01-15 10:19:21 来源:WEB开发网分页存储过程注入的机会: 上面的通用分页存储过程之所以会说存在SQL注入的机会,是因为通配符like后面的单引号,如果在后面参数中也出现单引号与like通配符后面的单引号相匹配后,后面的内容就是SQL注入的内容了。此时我们可以写一个过滤SQL特殊字符的方法,对特殊字符进行处理,可能根据自己的情况,选取相应过滤条件。最起码要把用户名中的单引号替换成双引号。下面的写法是不安全的:用户名中有单引号,例如 :Jim's dog
if(sUserName!="")
{
strWhere +=" and first_name like'%"+sUserName+"%'"
}
说明:园友 小No提到,能够通过把输入注入条件编码成十六进制编码来骗过过滤程序。这种情况的确存在,所有可以针对html标签中又属于SQL敏感字符的内容进行十六进制的比较。例如:‘,;。“-”不用处理,因为它不会被HTML编码。
我个人不太支持这种所谓高效的通用分页存储过程,理由:
1:可阅读性太差,整版的字符串,谁看着都不舒服。
2:对应用程序有比较高的安全要求,稍不注意就会存在上面所说的注入漏洞。
3:对多表的复杂查询无能无力。如果强行应用,我想远比单独写一个存储过程来的麻烦。
4:所谓通用,即大多数人都知道你这个存储过程的大致结构,这样无疑给别有用心者更多可趁之机。
针对分页存储过程的处理,不妨看看这篇:你是如何面对大量分页需求的?
总结:通用分页存储过程本身是没有漏洞可言的,只不过是程序的不严谨造成的注入机会。
解决这种拼接SQL字符串可能带来的隐患方案:
1:尽量对输入参数进行类型设置,能设置成数字型的一定要设成数字型。
2:设置好参数的长度,一个字符串,例如姓名,一般不会超过20个字符。
3:输入的参数内容能删除空格的就最好利用Trim(),这样,就算有SQL敏感字符,一旦SQL连接成一串,那也是不能够正常注入。
4:尽量过滤传入的条件,起码要把单引号替换成双引号。
5:严格设置数据库用户的权限,负责查询的用户,只让它具有读的权限,这样就算是注入成功,也不能造成致命的后果。
具有插入权限的用户,严格控制删除,更新的权限。而佣有删除权限的用户,一般都佣有查看权限,删除操作是很难存在SQL注入的。
更多精彩
赞助商链接