如何在不使用cfqueryparam的情况下编码/转义varchar以更安全?

时间:2011-08-23 18:35:26

标签: coldfusion cfqueryparam

如何在不使用cfqueryparam的情况下编码/转义varchar以更安全?我想实现相同的行为,而不使用<cfqueryparam>来解决“此RPC请求中提供的参数太多。最大值为2100”的问题。请参阅:http://www.bennadel.com/blog/1112-Incoming-Tabular-Data-Stream-Remote-Procedure-Call-Is-Incorrect.htm

更新:

  • 我想要验证/安全部分,而不生成预备声明。
  • 我可以对<cfquery>内的varchar做什么最强的编码/转义?
  • 可能与mysql_real_escape_string()类似的东西?

6 个答案:

答案 0 :(得分:6)

正如其他人所说,长度相关的错误起源于更深层次,而不是在queryparam标记内。它提供了一些有价值的保护,因此存在是有原因的。

您可以随时将这些值插入临时表并与该表联接,或使用列表函数将该巨大列表拆分为几个较小的列表,然后单独使用。

SELECT name , 
       ..... , 
       createDate
FROM somewhere
WHERE (someColumn IN (a,b,c,d,e)
       OR someColumn IN (f,g,h,i,j)
       OR someColumn IN (.........));

答案 1 :(得分:2)

cfqueryparam执行多项功能。

  1. 验证数据类型。如果你说整数,它确保有一个整数,如果没有,它确实允许它通过

  2. 它将SQL脚本的数据与可执行代码分开(这是您从SQL注入中获得保护的地方)。作为参数传递的任何内容都无法执行。

  3. 它在数据库引擎级别创建绑定变量,以帮助提高性能。

  4. 这就是我理解cfqueryparam工作的方式。您是否考虑过拨打几个小电话而不是一个大电话?

答案 2 :(得分:1)

这是一个安全问题。停止SQL注入

Adob​​e建议您在每个cfquery标记中使用cfqueryparam标记,以帮助保护您的数据库免受未经授权的用户的攻击。有关详细信息,请参阅安全公告ASB99-04,“动态查询中的多个SQL语句”,网址为www.adobe.com/devnet/security/security_zone/asb99-04.html,以及ColdFusion Developer中的“访问和检索数据”指南。

答案 3 :(得分:1)

我要问自己的第一件事是“我怎么会在一次查询中得到超过2100个参数?”。因为这对你来说应该是一个非常大的红旗。

然而,如果你坚持这一点(或者由于它是你的控制权,或者是你的动机水平来解决;-),那么我会考虑:

  • 前面提到的临时表格想法
  • 对于超过一定长度的值,只需将它们切成两半并将它们与字符串连接符连接起来,例如:

*

SELECT *
FROM tbl
WHERE col IN ('a', ';DROP DATABAS'+'E all_my_data', 'good', 'etc' [...])

这有点严峻,但是你的整个查询听起来很严峻,所以这可能不是一个问题。

  • 超过一定长度的param值或其中有停用词或其他内容。这也是一个非常严峻的建议。

  • 严格回顾您的要求,看看是否有办法不需要2100+参数。你真正需要做的是什么,这需要所有这些???

答案 4 :(得分:1)

问题不在于cfqueryparam,而在于MsSQL本身:

每个SQL批处理必须符合批量大小限制:65,536 *网络包大小。

Maximum size for a SQL Server Query? IN clause? Is there a Better Approach

http://msdn.microsoft.com/en-us/library/ms143432.aspx

答案 5 :(得分:0)

我遇到过这个问题的几次,我已经能够使用子选择和/或表连接重写查询。我建议尝试重写这样的查询,以避免参数max。

如果无法重写(例如,所有多个参数都来自外部源),您需要自己验证数据。我使用了以下正则表达式来执行安全验证:

<cfif ReFindNoCase("[^a-z0-9_\ \,\.]",arguments.InputText) IS NOT 0>
    <cfthrow type="Application" message="Invalid characters detected">
</cfif>

如果在文本字符串中找到除逗号,下划线或句点之外的任何特殊字符,则代码将强制执行错误。 (您可能希望处理情况更清晰而不仅仅是抛出错误。)我建议您根据要验证的字段中的预期值或允许值来根据需要修改它。如果要验证一串逗号分隔的整数,则可以切换为使用更加限制的正则表达式,如"[^0-9\ \,]",它只允许使用数字,逗号和空格。

这个答案不会逃避角色,它不会让它们放在第一位。它应该用于您不会与<cfqueryparam>一起使用的任何数据。就个人而言,当我使用动态排序字段时,我才发现需要这样做;并非所有数据库都允许您将绑定变量与ORDER BY子句一起使用。