【问题标题】:how to prevent coldfusion sql-injection on order by clause如何防止coldfusion sql-injection on order by子句
【发布时间】:2011-10-15 08:20:20
【问题描述】:

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

ORDER BY #xmlformat(myVariable)#

谢谢,

【问题讨论】:

    标签: sql coldfusion sql-injection


    【解决方案1】:

    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,

      【讨论】:

        【解决方案3】:

        XML 格式无法处理所有情况。

        列检查很好,但我猜让用户定义顺序的好处是,您可以使它比单个列更复杂。例如,您可以添加几列和升序、降序等...

        我建议您创建一个全局可用的函数,该函数可以去除任何不是数字、字母或逗号的字符。如果有人确实尝试进行 SQL 注入,它只会失败。

        【讨论】:

          【解决方案4】:

          另一个选项是对 ListFindNoCase 方法的轻微改动。列信息可以存储在结构中。 key 是公开可见的列名,value 是真实的列名。它有点复杂。但我喜欢它不要求你公开你的架构的事实。正如 Dave 提到的,它还支持更多的复合语句。

          <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>
          

          【讨论】:

            【解决方案5】:
            <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>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-01-13
              • 1970-01-01
              • 2012-09-13
              • 2019-03-21
              • 1970-01-01
              相关资源
              最近更新 更多