2010-06-09 80 views
1

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

我发现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 ([email protected]) 
* @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> 

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

回答

9

如果这个网站是一个遗留网站,并且它具有很多动态查询功能。 然后,重写所有的查询是一个 艰巨的任务,它需要一个 回归和 性能测试。

没错,但这样的话,如果你执行任何显著的变化,包括使用像你提出的一个功能。

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

说的具体功能是一堆废话,这不做什么它声称要做,并有打破的东西(不正确地由超过最大长度)的潜力。

它只是将--转换成&#45;&#45;'转换成&#39; - 这不是SQL注入保护!

所以是的,如果你仍然想沿着这条路线走,找到一个不同的功能,但我建议适当的重构。

+0

你是绝对正确的。我的观点是,重构数百个使用cfqueryparam的查询涉及更长的测试周期,而不是重新连接现有的函数以利用中央函数在执行前清理输入。那么,你可以说在一天结束的时候,这仍然涉及到严格的测试,这是事实,但至少它是集中包含的。 你碰巧知道一个很好的开源功能(理想情况下在CF中)完成这项工作吗? – user164701 2010-06-09 14:24:26

3

很明显,你有很多工作要做。但是,当你卷起袖子时,为减轻注入攻击造成的一些潜在损害,你可能会做的一件小事是创建几个数据源,并通过仅限于select语句的数据源运行所有的select查询。并且对于所有数据源,请确保诸如grant,revoke,create,alterdrop被禁用。

0

您可以试试Portcullis。这是一个开源的CFC,您可以使用它来扫描SQL Injection和XSS攻击的URL,FORM和COOKIE范围。它不能保证保护,但至少在今天提供一些保护,在你重写查询时不费吹灰之力。好处是它可以包含在Application.cfm/cfc中,以约4行代码为代价扫描每个CF页面请求的范围。