gpt4 book ai didi

sql-server - 在变量中使用语句时,Coldfusion 更新查询会抛出错误

转载 作者:行者123 更新时间:2023-12-01 11:14:28 24 4
gpt4 key购买 nike

尝试使用包含逗号分隔的列更新集的变量。该变量最终包含有效的 SQL(或更准确地说是有效的 Coldfusion 语法),但查询会引发错误:[Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near '<'。

我从要更新的初始专栏开始:

<cfset sqlString = myColumn & ' = <cfqueryparam value="#myValue#" cfsqltype="#myDataType#" null="#NOT len(trim(myValue))#">'>

然后循环遍历一些表单元素:

<cfset sqlString = sqlString & ', ' & myColumn & ' = <cfqueryparam value="#myValue#" cfsqltype="#myDataType#" null="#NOT len(trim(myValue))#">'>

当然,我在 sqlString 中得到了一个完整的字符串,但为了可读性,它包含如下内容:

id = <cfqueryparam value="123" cfsqltype="cf_sql_integer">,
csp = <cfqueryparam value="5" cfsqltype="cf_sql_integer">,
Q185 = <cfqueryparam value="" cfsqltype="cf_sql_integer" null="YES">,
Q3 = <cfqueryparam value="" cfsqltype="cf_sql_integer" null="YES">,
Q177 = <cfqueryparam value="" cfsqltype="cf_sql_date" null="YES">

所以我尝试在这样的更新查询中使用它:

<cfquery name="update_answers" datasource="#application.datasource#">
UPDATE answers
SET #PreserveSingleQuotes(sqlString)#
WHERE rec_id = #id#
</cfquery>

无论是否使用 PreserveSingleQuotes 函数,我都试过了,但均无济于事。

如果我像这样输出 sqlString 的内容并将其直接粘贴到查询中,它工作正常:

<cfquery name="update_answers" datasource="#application.datasource#">
UPDATE answers
id = <cfqueryparam value="123" cfsqltype="cf_sql_integer">,
csp = <cfqueryparam value="5" cfsqltype="cf_sql_integer">,
Q185 = <cfqueryparam value="" cfsqltype="cf_sql_integer" null="YES">,
Q3 = <cfqueryparam value="" cfsqltype="cf_sql_integer" null="YES">,
Q177 = <cfqueryparam value="" cfsqltype="cf_sql_date" null="YES">
WHERE rec_id = #id#
</cfquery>

再次强调,为了便于阅读,我在这里显示了换行符,但是我将 sqlString 内容粘贴到查询中时使用或不使用换行符都没有关系;它会起作用。

有什么想法吗?

最佳答案

tldr;

CFQueryparam不能嵌套在字符串中。必须在<cfquery>内直接使用标签。要使用动态参数构建 sql 语句,请查看 cfscript equivalent of cfqueryparam .

安全问题

虽然您可能只尝试了 PreserveSingleQuotes()出于绝望,永远不要使用该函数,除非您了解其后果,因为它基本上会在您的应用程序中创建一个很大的 sql 注入(inject)漏洞。

<cfset sqlString = sqlString & ', ' & myColumn

另外,要非常小心那种动态的sql语句。即使您使用 cfqueryparam 保护所有参数,查询仍然容易受到 sql 注入(inject)攻击,因为 myColumn是用户提供的值。不幸的是,cfqueryparam 不能保护对象名(表名、列名等),只能保护文字(字符串、日期等)。因此,如果您绝对必须在原始 sql 中使用动态列名,请务必根据白名单对其进行验证,并在检测到无效列时拒绝请求。

关于sql-server - 在变量中使用语句时,Coldfusion 更新查询会抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54469282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com