防止通过ORDER BY 进行SQL语句注入

背景:一般MIS系统的开发中,都会给表格设计一个题头进行排序的功能。具体的实现是将SQL语句中的ORDER BY 字句的两个参数:排序字段、排序方式作为对象的属性,由前台提交到后台。


问题:如果对这两个参数(我暂且称为sortName,sortType)没有进行有效的控制,就可能导致脚本注入。泄漏数据库的信息。例如:
 sortName="xxxName";

 sortType="ASC ,if(116<115),1,(select 1 from information_schema.tables))";


解决方案:我们可以对sortType进行限制,必须是ASC或者DESC.另外,还要对sortName也进行限制,因为当sortType为空字符串时,可能通过sortName也能注入成功。对于sortName的限制策略有多种:1.可以判断这个值是不是数据库的某个字段名;2也可以通过字符串长度进行限制,例如限制在20个字符内等。


备注:上面提到的方式对于多重排序字段的请求不兼容,需要另外考虑其他设计,例如设计成数组来存储排序列和排序方式。同时,对于有些DBMS可以将SQL表达式作为排序字段的,也需要另外考虑。

猜你喜欢

转载自ultrang.iteye.com/blog/2245792