2009-06-02 18 views
5

我有清理一堆旧的ColdFusion代码的不幸任务。查询到处都是,我正在努力将它们全部转移到常用的CFC上,以便于维护。如何覆盖ColdFusion中的SQL清理

我遇到了问题,因为cfquery会自动将单引号转换为双引号。我如何覆盖这种行为?

更多具体信息如下。


因此,这里是我开始与查询:

<cfquery name="getObjectInfo" datasource="#BaseDS#"> 
    SELECT groupName AS lastname, '[Group]' AS firstname 
    FROM groups 
    WHERE groups.group_id = #objectreference_id# 
</cfquery> 

这里奇怪的是,文字被的,因为我们希望它显示(同样的方式“选择”,我没我写这个,我只是想把它清理一下)。所以,在公共功能,对于SELECT子句的可选参数:

<cffunction name="fSelGroup" access="public" returntype="query" 
       hint="Returns query selecting given group."> 

    <cfargument name="intGroupID" type="numeric" required="true" 
       hint="ID of group to be returned." /> 
    <cfargument name="strSelectAttributes" type="string" required="false" 
       hint="Attributes to be selected in query" 
       default="*" /> 

    <cfquery name="getObjectInfo" datasource="#Application.DataSource#"> 
     SELECT #Arguments.strSelectAttributes# 
     FROM Groups 
     WHERE Group_ID = #Arguments.intGroupID# 
    </cfquery> 

    <cfreturn getObjectInfo /> 

    </cffunction> 

这是问题所在:当我通过在"GroupName AS LastName, '[Group]' AS FirstName"为strSelectAttributes参数,发送到数据库的查询是:

SELECT GroupName AS LastName, ''[Group]'' AS FirstName 
FROM Groups 
WHERE Group_ID = 4 

您知道,我的引语被“消毒”为无效查询。

+0

另请参阅http:// stackoverflow。com/questions/266586/coldfusion-adding-extra-quotes-when-construct-database-queries-in-strings – ale 2009-06-02 19:39:53

回答

17

ColdFusion不会转义所有单引号,但只有那些通过变量插值到达查询中的引号。这是罪犯:

SELECT #Arguments.strSelectAttributes# 

这对于SQL注入攻击通常是一件有用的事情和一道防线。所以第一个规则是(在这里和其他地方):不要从变量中构建你的SQL字符串。

如果肯定要使用变量,建立一个SQL字符串,尽管所有的可能的负面影响,使用PreserveSingleQuotes()功能:

​​

这个函数从自动转义的单引号停止的ColdFusion。

顺便说一下,其他任何函数调用都会执行相同的操作。尝试:

​​

这意味着PreserveSingleQuotes()实际上只是一个无操作,轮流一个字符串转换为函数结果,防止自动可变插值例程的发生。

+0

+1非常酷的知道。 – 2009-06-03 13:51:51

7

在您的变量周围调用preserveSingleQuotes()。它专门用于编写动态SQL。另外,你确实应该使用cfqueryparam来表示你的值,我希望你以某种方式清理你的输入,以使arguments.strSelectAttributes不能包含'; drop table groups;在里面。

<cfquery name="getObjectInfo" datasource="#Application.DataSource#"> 
    SELECT #preserveSingleQuotes(Arguments.strSelectAttributes)# 
    FROM Groups 
    WHERE Group_ID = <cfqueryparam value="#Arguments.intGroupID#" cfsqltype="cf_sql_integer"/> 
</cfquery> 
+0

谢谢。我知道sql注入,但在我的情况下,参数只来自我们控制的代码,而不是来自用户。 – Kip 2009-06-02 16:52:05

-3

如果你真的想清理代码第二步是将意大利面条转换成存储过程。