【发布时间】:2011-10-15 08:20:20
【问题描述】:
由于 cfqueryparam 不能按顺序工作,使用 xmlformat 会停止 sql 注入吗?
ORDER BY #xmlformat(myVariable)#
谢谢,
【问题讨论】:
标签: sql coldfusion sql-injection
由于 cfqueryparam 不能按顺序工作,使用 xmlformat 会停止 sql 注入吗?
ORDER BY #xmlformat(myVariable)#
谢谢,
【问题讨论】:
标签: sql coldfusion sql-injection
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>
【讨论】:
这是来自存储过程,但将 @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,
【讨论】:
XML 格式无法处理所有情况。
列检查很好,但我猜让用户定义顺序的好处是,您可以使它比单个列更复杂。例如,您可以添加几列和升序、降序等...
我建议您创建一个全局可用的函数,该函数可以去除任何不是数字、字母或逗号的字符。如果有人确实尝试进行 SQL 注入,它只会失败。
【讨论】:
另一个选项是对 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>
【讨论】:
<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>
等
【讨论】: