如何在order by子句中防止coldfusion sql-injection

时间:2011-07-28 17:37:58

标签: sql coldfusion sql-injection

由于cfqueryparam不按顺序工作,会使用xmlformat停止sql注入吗?

ORDER BY #xmlformat(myVariable)#

谢谢,

5 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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,

答案 2 :(得分:1)

XML格式不会处理所有情况。

列检查很好,但我猜测让用户定义顺序是什么的好处是因为你可以让它比单个列更复杂。例如,您可以添加多个列和升序,降序等...

我建议你创建一个全局可用的函数来删除任何不是数字,字母或逗号的字符。如果有人确实试图进行SQL注入,那么它就会失败。

答案 3 :(得分: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>

答案 4 :(得分:-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>