Coldfusion 保留SingleQuotes和CFQueryParam

Coldfusion 保留SingleQuotes和CFQueryParam,coldfusion,cfqueryparam,Coldfusion,Cfqueryparam,我正在使用CFLoop构建一个动态SQL查询。 我使用cfsavecontent迭代变量并构建查询,然后在CFQuery中使用preservesingsinglequotes执行它。 这很好,但是这个方法的问题是我不能使用CFQueryParam,所以我的查询很容易被注入。 我想知道这个问题是否有解决办法 更新: 因此,在这个示例中,正如您所看到的,我不能将cfqueryparam用于arguments.leve,因为它将在PreserveSingSingleQuotes上崩溃。诀窍是使用cfq

我正在使用CFLoop构建一个动态SQL查询。 我使用cfsavecontent迭代变量并构建查询,然后在CFQuery中使用preservesingsinglequotes执行它。 这很好,但是这个方法的问题是我不能使用CFQueryParam,所以我的查询很容易被注入。 我想知道这个问题是否有解决办法

更新:

因此,在这个示例中,正如您所看到的,我不能将cfqueryparam用于arguments.leve,因为它将在PreserveSingSingleQuotes上崩溃。诀窍是使用cfqueryparam的list参数。它将正确格式化查询数据、转义引号(如果需要)以及所有数据

如果列表为数值,例如,在1,2,3,4语句中的WHERE X中:

如果列表包含字符串值:

这也适用于cfprocparam。

诀窍是使用cfqueryparam的list参数。它将正确格式化查询数据、转义引号(如果需要)以及所有数据

如果列表为数值,例如,在1,2,3,4语句中的WHERE X中:

如果列表包含字符串值:


这也适用于cfprocparam。

您是否查看了上的文档?理论上,我们所有人都会始终验证所有用户提供的字段。仅依靠查询参数来实现安全性并不像您所能做到的那样安全。此外,保留SingleQuotes也有它的位置,但我从未让它成功地处理撇号。因为这是一个移动Web服务,我无法在移动应用程序旁边验证用户的输入。如果有人嗅探URL并尝试注入SQL,我将需要停止它。您始终需要验证/清理用户输入。始终在服务器上,最好在前端,以获得更好的用户体验。我不是在听你的问题。为什么不能使用cfqueryparam?当然,一个代码示例会有所帮助。参数并不是用来作为SQLi保护的机制,这只是适当地参数化SQL语句的副作用。答案是在CFQUERY param标记内创建动态SQL语句。这就是他们的目的。也就是说,您使用的是什么版本的CF?您是否查看了上的文档?理论上,我们所有人都会始终验证所有用户提供的字段。仅依靠查询参数来实现安全性并不像您所能做到的那样安全。此外,保留SingleQuotes也有它的位置,但我从未让它成功地处理撇号。因为这是一个移动Web服务,我无法在移动应用程序旁边验证用户的输入。如果有人嗅探URL并尝试注入SQL,我将需要停止它。您始终需要验证/清理用户输入。始终在服务器上,最好在前端,以获得更好的用户体验。我不是在听你的问题。为什么不能使用cfqueryparam?当然,一个代码示例会有所帮助。参数并不是用来作为SQLi保护的机制,这只是适当地参数化SQL语句的副作用。答案是在CFQUERY param标记内创建动态SQL语句。这就是他们的目的。也就是说,你使用的是什么版本的CF?我在问题中没有看到任何东西表明OP只是生成一个值列表。此外,使用cfprocparam传递数值列表并不总是能够实现目标。当我使用sql server执行此操作时,我使用了表值参数。我在问题中没有看到任何东西表明OP只是生成一个值列表。此外,使用cfprocparam传递数值列表并不总是能够实现目标。使用sql server执行此操作时,我使用表值参数。
    <cfsavecontent variable="sqlstring">
            SELECT   id
                    ,(CASE
                        <cfloop query="qGetRules">
                            WHEN val1 >=#qGetRules.equ# AND val2 >#arguments.leve# THEN 1
                        </cfloop>
                        ELSE 0
                         END) AS criteria
            FROM mt4_users
    </cfsavecontent>


    <cfquery name="qGetEquity" datasource="mydatasource">
        #PreserveSingleQuotes(variables.sqlstring)#
    </cfquery>