针对 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>
这似乎是一个非常简单的过滤器,我想知道是否有办法改进它或提出更好的解决方案?