使用通过 AJAX 接收到的参数在 cfc 中执行 cfquery
executing cfquery in cfc with parameters received via AJAX
我正在尝试建立一个系统,允许我从我的 JavaScript 代码中获取 ColdFusion 数据库中的数据。但是,我 运行 遇到了一个错误,我不确定是什么原因造成的。我是 CF 新手,我使用的引擎 运行ning 是 ColdFusion MX 7。
这是 CFC 文件,cfquery.cfc
:
<cfcomponent output="no">
<cffunction name="phonebookQuery" access="remote" returnType="struct">
<cfargument name="select" type="string" required="yes">
<cfargument name="from" type="string" required="yes">
<cfargument name="where" type="string" required="yes">
<cfargument name="orderBy" type="string" required="yes">
<cfquery name="query" datasource="phonebook">
SELECT #select#
FROM #from#
WHERE #where#
ORDER BY #orderBy#
</cfquery>
<cfreturn query>
</cffunction>
</cfcomponent>
我可能没有正确地返回东西,但我的代码没有执行到我发现的那么远。
这是执行AJAX调用的JS函数。我知道我不应该使用 async: false
,但我只需要一些暂时可用的东西。我计划在它工作后实施承诺或回调。
function cfQuery(p){
var result;
var queryStr= "cfquery.cfc?method=phonebookQuery&" +
"select="+p.select+"&"+
"from="+p.from+"&"+
"where="+p.where.replace("=","%3D")+"&"+
"orderBy="+p.orderBy;
$.get( queryStr, function(data){
result=data;
});
return result;
}
我试图开始工作的函数调用的具体示例是:
var query_result= cfQuery({
select: "*",
from: "shareloantypes",
where: "share_loan='S'",
orderBy: "share_loan_type"
});
当我尝试 运行 代码时出现内部服务器错误。它抱怨 SQL:
中 where 子句附近的语法
Error Executing Database Query.
[Macromedia][SequeLink JDBC Driver][ODBC Socket][Microsoft][ODBC SQL Server Driver][SQL Server]
Line 1: Incorrect syntax near 'S'.
The error occurred in C:\Inetpub\wwwroot\xxxxxx\report\cfquery.cfc: line 12
10 : FROM #from#
11 : WHERE #where#
12 : ORDER BY #orderBy#
13 : </cfquery>
14 : <cfreturn query>
SQL SELECT * FROM shareloantypes WHERE share_loan=''S'' ORDER BY share_loan_type
DATASOURCE phonebook
VENDORERRORCODE 170
SQLSTATE 42000
您可以看到我的 'S' 被替换为“'S'”。我该如何解决这个问题?如果我在函数调用中用 where: "share_loan=S"
替换 where: "share_loan='S'"
那么生成的 SQL 根本没有引号,而不是每边 2 个引号,我得到"invalid column name".
试一试:
<cfquery name="query" datasource="phonebook">
SELECT '#select#'
FROM '#from#'
WHERE '#where#'
ORDER BY '#orderBy#'
</cfquery>
我从我的研究中回想起,在变量周围加上引号告诉 coldfusion 它应该以类似 sql 的方式处理这些值。也就是说,它不会转义您输入的引号(或者,更准确地说,它会智能地转义它们)。
此外,根据我的个人经验,它还可以阻止 SQL 注入(您的代码目前对此完全开放)。实际上存在 coldfusion 准备语句,但我认为这是构建它们的 shorthand 方法,仍然可以防止注入。 如果有人最终知道,并且可以提供使用这种技术的注入示例,请纠正我。
编辑: 再次查看您的代码,这可能有效,也可能无效。根据我的个人经验,我一直只是传递变量值,而不是构造查询本身。如果可以,请尝试做类似
的事情
<cfquery name="query" datasource="phonebook">
SELECT *
FROM mytable
WHERE ID > '#minID#'
ORDER BY ID DESC
</cfquery>
在这种情况下,您只是传递要比较的值,而不是实际构建整个 WHERE
子句。
编辑: 我不能凭良心把这段代码留在这里,因为我不完全相信它不会受到 SQL 注入的攻击。执行我发布的第二个查询(只有 WHERE 子句有变量的查询)的正确方法如下:
<cfquery name="query" datasource="phonebook">
SELECT *
FROM mytable
WHERE ID > <cfqueryparam value="#minID#" CFSQLType="CF_SQL_INTEGER">
ORDER BY ID DESC
</cfquery>
您可以在此处阅读有关 cfqueryparam
的更多信息:http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f6f.html
我正在尝试建立一个系统,允许我从我的 JavaScript 代码中获取 ColdFusion 数据库中的数据。但是,我 运行 遇到了一个错误,我不确定是什么原因造成的。我是 CF 新手,我使用的引擎 运行ning 是 ColdFusion MX 7。
这是 CFC 文件,cfquery.cfc
:
<cfcomponent output="no">
<cffunction name="phonebookQuery" access="remote" returnType="struct">
<cfargument name="select" type="string" required="yes">
<cfargument name="from" type="string" required="yes">
<cfargument name="where" type="string" required="yes">
<cfargument name="orderBy" type="string" required="yes">
<cfquery name="query" datasource="phonebook">
SELECT #select#
FROM #from#
WHERE #where#
ORDER BY #orderBy#
</cfquery>
<cfreturn query>
</cffunction>
</cfcomponent>
我可能没有正确地返回东西,但我的代码没有执行到我发现的那么远。
这是执行AJAX调用的JS函数。我知道我不应该使用 async: false
,但我只需要一些暂时可用的东西。我计划在它工作后实施承诺或回调。
function cfQuery(p){
var result;
var queryStr= "cfquery.cfc?method=phonebookQuery&" +
"select="+p.select+"&"+
"from="+p.from+"&"+
"where="+p.where.replace("=","%3D")+"&"+
"orderBy="+p.orderBy;
$.get( queryStr, function(data){
result=data;
});
return result;
}
我试图开始工作的函数调用的具体示例是:
var query_result= cfQuery({
select: "*",
from: "shareloantypes",
where: "share_loan='S'",
orderBy: "share_loan_type"
});
当我尝试 运行 代码时出现内部服务器错误。它抱怨 SQL:
中 where 子句附近的语法Error Executing Database Query.
[Macromedia][SequeLink JDBC Driver][ODBC Socket][Microsoft][ODBC SQL Server Driver][SQL Server]
Line 1: Incorrect syntax near 'S'.
The error occurred in C:\Inetpub\wwwroot\xxxxxx\report\cfquery.cfc: line 12
10 : FROM #from#
11 : WHERE #where#
12 : ORDER BY #orderBy#
13 : </cfquery>
14 : <cfreturn query>
SQL SELECT * FROM shareloantypes WHERE share_loan=''S'' ORDER BY share_loan_type
DATASOURCE phonebook
VENDORERRORCODE 170
SQLSTATE 42000
您可以看到我的 'S' 被替换为“'S'”。我该如何解决这个问题?如果我在函数调用中用 where: "share_loan=S"
替换 where: "share_loan='S'"
那么生成的 SQL 根本没有引号,而不是每边 2 个引号,我得到"invalid column name".
试一试:
<cfquery name="query" datasource="phonebook">
SELECT '#select#'
FROM '#from#'
WHERE '#where#'
ORDER BY '#orderBy#'
</cfquery>
我从我的研究中回想起,在变量周围加上引号告诉 coldfusion 它应该以类似 sql 的方式处理这些值。也就是说,它不会转义您输入的引号(或者,更准确地说,它会智能地转义它们)。
此外,根据我的个人经验,它还可以阻止 SQL 注入(您的代码目前对此完全开放)。实际上存在 coldfusion 准备语句,但我认为这是构建它们的 shorthand 方法,仍然可以防止注入。 如果有人最终知道,并且可以提供使用这种技术的注入示例,请纠正我。
编辑: 再次查看您的代码,这可能有效,也可能无效。根据我的个人经验,我一直只是传递变量值,而不是构造查询本身。如果可以,请尝试做类似
的事情<cfquery name="query" datasource="phonebook">
SELECT *
FROM mytable
WHERE ID > '#minID#'
ORDER BY ID DESC
</cfquery>
在这种情况下,您只是传递要比较的值,而不是实际构建整个 WHERE
子句。
编辑: 我不能凭良心把这段代码留在这里,因为我不完全相信它不会受到 SQL 注入的攻击。执行我发布的第二个查询(只有 WHERE 子句有变量的查询)的正确方法如下:
<cfquery name="query" datasource="phonebook">
SELECT *
FROM mytable
WHERE ID > <cfqueryparam value="#minID#" CFSQLType="CF_SQL_INTEGER">
ORDER BY ID DESC
</cfquery>
您可以在此处阅读有关 cfqueryparam
的更多信息:http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f6f.html