1

针对 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>

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

4

4 回答 4

9

如果该站点是旧站点并且具有许多动态查询,该怎么办。然后,重写所有查询是一项艰巨的任务,需要大量的回归和性能测试。

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

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

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

它所做的只是变成--&#45;&#45;变成'——&#39;这不是 SQL 注入保护!

所以,是的,如果你仍然想走那条路,找一个不同的函数,但我建议进行适当的重构。

于 2010-06-09T06:54:22.317 回答
3

显然,你有很多工作要做。但是当您卷起袖子时,您可能会做的一件小事来减轻注入攻击的一些潜在损害是创建多个数据源,并select通过仅限于select语句的数据源运行您的所有 -only 查询。对于所有数据源,请确保禁用grantrevokecreatealter和等内容。drop

于 2010-06-09T15:14:51.823 回答
0

你可以试试Portcullis。它是一个开源 CFC,可用于扫描 URL、FORM 和 COOKIE 范围以进行 SQL 注入和 XSS 攻击。它不会得到保证的保护,但在您重写查询时,至少会在今天毫不费力地提供一些保护。好处是它可以包含在 Application.cfm/cfc 中,以扫描每个 CF 页面请求的范围,而代价是大约 4 行代码。

于 2010-06-10T22:09:27.540 回答
-1

将此编码放入您的 application.cfm 文件中。

<cfif FindNoCase(“DECLARE”,cgi.query_string) and FindNoCase(“CAST”,cgi.query_string) and FindNoCase(“EXEC”,cgi.query_string)> <cfabort showerror="Oops..!! 这是 SQL 注入。" > </cfif>

http://ppshein.wordpress.com/2008/08/23/sql-injection-attacks-by-store-procedure/

http://ppshein.wordpress.com/2008/08/28/block-ip-in-coldfusion/

于 2010-08-03T08:10:47.317 回答