使用通过AJAX接收的参数在cfc中执行cfquery

时间:2015-05-18 16:38:21

标签: javascript ajax coldfusion

我正在尝试建立一个允许我从我的JavaScript代码中获取ColdFusion数据库数据的系统。但是,我遇到了一个错误,我不确定是什么导致它。我是CF的新手,我正在运行的引擎是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

你可以看到我的&#39; S&#39;正在被&#39;&#39;&#39;取代。我该如何解决这个问题?如果我在函数调用中用where: "share_loan='S'"替换where: "share_loan=S",那么生成的SQL根本就没有引号,而不是每一行都有2,我得到了#34;列名无效&#34;。

1 个答案:

答案 0 :(得分:1)

尝试一下:

<cfquery name="query" datasource="phonebook">
    SELECT '#select#'
    FROM '#from#'
    WHERE '#where#'
    ORDER BY '#orderBy#'
</cfquery>

正如我从研究中回忆的那样,在变量周围加上引号告诉coldfusion它应该以类似sql的方式处理这些值。也就是说,它不会逃避你正在喂它的引号(或者更确切地说,它会智能地逃脱它们)。

此外,根据我的个人经验,它还会阻止SQL注入(您的代码目前是开放的)。实际上存在coldfusion准备的语句,但我认为这是构建它们的简写方法,它仍然可以防止注入。 如果有人确凿地知道,并且即使使用这种技术也能提供注射的例子,请纠正我。

编辑:再次查看您的代码,这可能会有效,或者可能不会。根据我的个人经验,我只是传递变量值,而不是构建查询本身。如果可以的话,尝试做类似

的事情
<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>

您可以在此处详细了解cfqueryparamhttp://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f6f.html