Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coldfusion 如何在不使用cfqueryparam的情况下对varchar进行编码/转义以使其更安全?_Coldfusion_Cfqueryparam - Fatal编程技术网

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

Coldfusion 如何在不使用cfqueryparam的情况下对varchar进行编码/转义以使其更安全?,coldfusion,cfqueryparam,Coldfusion,Cfqueryparam,如何在不使用cfqueryparam的情况下对varchar进行编码/转义以使其更安全?我希望实现相同的行为,而不使用来回避“此RPC请求中提供的参数太多。最大值为2100”的问题。见: 更新: 我想要验证/安全部分,而不生成准备好的语句 我能对中的varchar执行的最强编码/转义是什么 也许是类似的 这是一个安全问题。停止SQL注入 Adobe建议您在每个cfquery标记中使用cfqueryparam标记,以帮助保护您的数据库免受未授权用户的攻击。有关更多信息,请参阅安全公告ASB99-

如何在不使用cfqueryparam的情况下对varchar进行编码/转义以使其更安全?我希望实现相同的行为,而不使用
来回避“此RPC请求中提供的参数太多。最大值为2100”的问题。见:

更新:

  • 我想要验证/安全部分,而不生成准备好的语句
  • 我能对
    中的varchar执行的最强编码/转义是什么
  • 也许是类似的
这是一个安全问题。停止SQL注入


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

cfqueryparam执行多种功能

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


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

  • 它在DB引擎级别创建绑定变量以帮助提高性能


  • 这就是我如何理解cfqueryparam的工作原理。你有没有研究过打几个小电话和打一个大电话的选择?

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

    您可以将这些值插入到临时表中并针对该临时表进行联接,也可以使用list函数将庞大的列表拆分为几个较小的列表,然后分别使用这些列表

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

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

    然而,如果你被这件事困住了(要么是因为它超出了你的控制能力,要么是因为超出了你的动机水平;-),那么我会考虑:

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

    这有点可怕,但您的整个查询听起来也很可怕,所以这可能不是什么大问题

    • 参数值超过一定长度,或其中包含停止字或其他内容。这也是一个相当严峻的建议

    • 认真回顾一下您的需求,看看是否有不需要2100+参数的方法。你真正需要做的是什么,需要所有这些


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

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


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

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

    <cfif ReFindNoCase("[^a-z0-9_\ \,\.]",arguments.InputText) IS NOT 0>
        <cfthrow type="Application" message="Invalid characters detected">
    </cfif>
    
    
    
    如果在文本字符串中发现逗号、下划线或句点以外的任何特殊字符,则代码将强制执行错误。(您可能希望处理这种情况,而不仅仅是抛出错误。)我建议您根据正在验证的字段中的预期值或允许值进行必要的修改。如果要验证逗号分隔的整数字符串,可以切换使用限制性更强的正则表达式,如
    “[^0-9\\,]”“
    ,它只允许数字、逗号和空格


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

    我明白它的作用。我想实现一个函数(或者调用一个函数,如果已经存在的话),它可以对值进行编码/转义或者其他任何操作。我不能使用cfqueryparam,因为“2100”绑定参数的上限“任何作为参数传递的内容都无法执行。”。。。所以我想我不能编码,但是我能对
    中的varchar做的最强的编码/转义是什么?有一个用于SQL的ESAPI编码器。目前它只支持MySQL和Oracle,但编写一个支持MS SQL的编解码器似乎并不难。但坦率地说,我认为你让这件事变得比你需要的困难得多。使用更少的查询。如果你不想一次做一个tham,那么一次做500个。这是一个大的SELECT WHERE IN()查询的一部分。。。无法打破它们。。。很容易。我想把它拆开很简单。我还没有测试过这个,但是根据你的另一篇文章,我认为这是一个可行的想法。Thx,但这一次查询看起来像是SELECT*FROM Foo,其中bar NOT IN('a','b',…2100+)不能轻易地将它们打破。我喜欢临时表(或者如果它是一组常量值,则是一个永久表或视图)的想法,它包含列表中的所有值。然后执行WHERE NOT IN(选择*FROM bad_params)或类似操作。这并不能解决问题,因为cfqueryparam的总数将是相同的。List=“True”对于2000的列表意味着2000个参数。但是亨利,单独的表的想法呢?这个答案真的是两全其美
    <cfif ReFindNoCase("[^a-z0-9_\ \,\.]",arguments.InputText) IS NOT 0>
        <cfthrow type="Application" message="Invalid characters detected">
    </cfif>