2011-07-28 36 views
4

防止coldfusion sql-injection訂單由於cfqueryparam不能按順序工作,會使用xmlformat stop sql注入嗎?如何通過條款

ORDER BY #xmlformat(myVariable)# 

感謝,

回答

6

http://www.petefreitag.com/item/677.cfm

一個好辦法繞過這個限制是使用ListFindNoCase功能,限制排序的列名,例如:

<cfset sortable_column_list = "age,height,weight,first_name"> 
<cfquery ...> 
    SELECT first_name, age, height, weight 
    FROM people 
    ORDER BY <cfif ListFindNoCase(sortable_column_list, url.sort_column)>#url.sort_column#<cfelse>first_name</cfif> 
</cfquery> 
2

這是來自存儲過程,但將@ORDER_BY值轉換爲實際的數據庫列和@SORT _ORDER賦值給SQL命令。


ORDER BY 
    CASE WHEN @ORDER_BY = 'LENDER' AND @SORT_ORDER = 'D' THEN l.tms_name END DESC, 
    CASE WHEN @ORDER_BY = 'LENDER' AND @SORT_ORDER != 'D' THEN l.tms_name END, 
    CASE WHEN @ORDER_BY = 'LOAN_NUMBER' AND @SORT_ORDER = 'D' THEN p.Loan_Number END DESC, 
    CASE WHEN @ORDER_BY = 'LOAN_NUMBER' AND @SORT_ORDER != 'D' THEN p.Loan_Number END,
1

XML格式不能處理所有情況。

列檢查是好的,但我猜測讓用戶定義按順序排列順序的好處是因爲你可以使它比單個列更復雜。例如,你可以添加幾列和升序,降序等...

我建議你做一個全局可用的函數,去掉任何不是數字,字母或逗號的字符。如果有人確實嘗試執行SQL注入,它就會失敗。

+0

很不錯的答案!謝謝, –

-1

另一種選擇是ListFindNoCase方法的輕微扭曲。列信息可以存儲在一個結構中。 key將是公開顯示的列名稱,value是真正的列名稱。這有點複雜。但我喜歡這個事實,它不需要需要你公開你的模式。它也支持戴夫提到的更多複合語句。

<cfset sortCols = { defaultCol="DepartmentName" 
        , date="ReportDate" 
        , type="DepartmentName" 
        , num="EmployeeID" } /> 
.... 
SELECT Columns 
FROM  TableName 
ORDER BY 
<cfif structKeyExists(sortCols, url.sort_column)> 
    #sortCols[url.sort_column]# 
<cfelse> 
    #sortCols["defaultCol"]# 
</cfif> 
+0

匿名投票,謹慎發表評論? – Leigh

0
<cfif refindnocas('^\w+ ?(desc|asc)?$', myVariable)> 
    ORDER BY #myVariable# 
</cfif> 

<cfset columnList = 'col1,col2,etc' /> <!--- might want to use in select as well ---> 
<cfset regexColList = replace(columnList, ',', '|', 'all') /> 

<cfif not refindnocas('^(#regexColList#) ?(desc|asc)?$', myVariable)> 
    <cfset myVariable = "DefaultSort" /> 
</cfif> 
ORDER BY #myVariable# 

ORDER BY #query_sort(myVariable, columnList, defaultSort)# 

... 

<cffunction name="query_sort"> 
    <cfargument name="sort" /> 
    <cfargument name="columns" /> 
    <cfargument name"default" /> 

    <cfset var regexcolumns = replace(columns, ',', '|', 'all') /> 
    <cfif refindnocas('^(#regexcolumns#) ?(desc|asc)?$', sort)> 
     <cfreturn sort /> 
    <cfelse> 
     <cfreturn default /> 
    </cfif> 
</cfargument>