用于动态查询的SQL注入保护

use*_*701 1 coldfusion sql-injection cfquery owasp

针对SQL注入漏洞的典型控制是使用绑定变量(cfqueryparam标记),字符串数据验证以及转向实际SQL层的存储过程.这很好,我同意,但如果该网站是遗留的,它具有很多动态查询.然后,重写所有查询是一项艰巨的任务,需要进行大量的回归和性能测试.我正在考虑使用动态SQL过滤器并在调用cfquery之前调用它以进行实际执行.

我在CFLib.org(http://www.cflib.org/udf/sqlSafe)中找到了一个过滤器:

<cfscript>
/**
* Cleans string of potential sql injection.
*
* @param string      String to modify. (Required)
* @return Returns a string.
* @author Bryan Murphy (bryan@guardianlogic.com)
* @version 1, May 26, 2005
*/
function metaguardSQLSafe(string) {
var sqlList = "-- ,'";
var replacementList = "#chr(38)##chr(35)##chr(52)##chr(53)##chr(59)##chr(38)##chr(35)##chr(52)##chr(53)##chr(59)# , #chr(38)##chr(35)##chr(51)##chr(57)##chr(59)#";

return trim(replaceList( string , sqlList , replacementList ));
}
</cfscript>
Run Code Online (Sandbox Code Playgroud)

这似乎是一个非常简单的过滤器,我想知道是否有办法改进它或提出更好的解决方案?

Pet*_*ton 9

如果该站点是遗留站点并且它具有大量动态查询,该怎么办?然后,重写所有查询是一项艰巨的任务,需要进行大量的回归和性能测试.

是的,但如果您执行任何重大更改,包括使用类似您提议的功能,则会出现这种情况.

因此,我仍然建议进行一些测试设置,重构以使用合理的框架,然后修复查询以使用cfqueryparam.

这个特定的功能是一堆废话,它没有做它声称做的事情,并且有可能破坏东西(错误地超过最大长度).

它所做的就是转--&#45;&#45;'&#39;-这是不是SQL注入防护!

所以,是的,如果你仍然希望沿着这条路走下去,找一个不同的功能,但我建议你进行适当的重构.