如何在不使用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()
类似的东西? 答案 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执行多项功能。
验证数据类型。如果你说整数,它确保有一个整数,如果没有,它确实允许它通过
它将SQL脚本的数据与可执行代码分开(这是您从SQL注入中获得保护的地方)。作为参数传递的任何内容都无法执行。
它在数据库引擎级别创建绑定变量,以帮助提高性能。
这就是我理解cfqueryparam工作的方式。您是否考虑过拨打几个小电话而不是一个大电话?
答案 2 :(得分:1)
这是一个安全问题。停止SQL注入
Adobe建议您在每个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
和
答案 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
子句一起使用。