2009-06-02 60 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

如果你真的想清理代碼第二步是將意大利麪條轉換成存儲過程。