3

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

更新:

  • 我想要验证/安全部分,而不生成准备好的语句。
  • 我可以对内部的 varchar 做的最强大的编码/转义是<cfquery>什么?
  • 类似于mysql_real_escape_string()可能的东西?
4

6 回答 6

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 (.........));
于 2011-08-23T20:31:41.807 回答
2

cfqueryparam 执行多种功能。

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

  2. 它将 SQL 脚本的数据与可执行代码分开(这是您获得 SQL 注入保护的地方)。任何作为参数传递的东西都不能被执行。

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

这就是我理解 cfqueryparam 工作的方式。您是否考虑过打几个小电话与打一个大电话的选择?

于 2011-08-23T18:44:57.170 回答
1

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

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

于 2011-08-23T18:43:34.490 回答
1

我要问自己的第一件事是“我到底是怎么在一个查询中得到超过 2100 个参数的?”。因为这本身对你来说应该是一个非常非常大的危险信号。

但是,如果你坚持这一点(要么是因为它超出了你的控制范围,要么是因为你没有解决问题的动力;-),那么我会考虑:

  • 前面提到的临时表思想
  • 对于超过一定长度的值,只需将它们切成两半,然后用字符串连接器将它们重新连接在一起,例如:

*

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

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

  • 超过一定长度或包含停用词或其他内容的参数值。这也是一个相当冷酷的建议。

  • 认真地回顾您的要求,看看是否有办法不需要 2100 多个参数。你实际上需要做什么需要这一切???

于 2011-08-23T23:55:48.023 回答
1

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

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

SQL Server 查询的最大大小?IN 子句?有没有更好的方法

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

于 2011-08-24T12:12:23.710 回答
0

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

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

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

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

这个答案不会逃避字符,它首先不会允许它们。它应该用于您不会使用的任何数据<cfqueryparam>。就个人而言,我只是在使用动态排序字段时才发现需要这样做;ORDER BY并非所有数据库都允许您在子句中使用绑定变量。

于 2013-09-10T18:10:35.437 回答