Kip*_*Kip 5 sql coldfusion sanitization cfquery
我有一个不幸的任务,清理一堆旧的ColdFusion代码.查询到处都是,我正在努力将它们全部转移到普通的CFC上以便于维护.
我遇到了一个问题,因为cfquery它会自动将单引号转换为双引号.我该如何覆盖这种行为?
更具体的信息如下.
所以这是我开始的查询:
<cfquery name="getObjectInfo" datasource="#BaseDS#">
SELECT groupName AS lastname, '[Group]' AS firstname
FROM groups
WHERE groups.group_id = #objectreference_id#
</cfquery>
Run Code Online (Sandbox Code Playgroud)
这里奇怪的是文字被"选中",因为我们希望它被显示的方式(再次,我没有写这个,我只是想把它清理一下).所以在common函数中,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>
Run Code Online (Sandbox Code Playgroud)
这是问题:当我传入"GroupName AS LastName, '[Group]' AS FirstName"strSelectAttributes参数时,发送到数据库的查询是:
SELECT GroupName AS LastName, ''[Group]'' AS FirstName
FROM Groups
WHERE Group_ID = 4
Run Code Online (Sandbox Code Playgroud)
你看,我的报价被"消毒"成一个无效的查询.
Tom*_*lak 17
ColdFusion不会转义所有单引号,只会转义那些通过变量插值到达查询的引号.这是罪犯:
SELECT #Arguments.strSelectAttributes#
Run Code Online (Sandbox Code Playgroud)
这通常是一个有用的东西和一小段防御SQL注入攻击.因此,规则一是(此处和其他地方):不要从变量构建SQL字符串.
如果您必须使用变量来构建SQL字符串,尽管可能存在所有负面影响,请使用以下PreserveSingleQuotes()函数:
SELECT #PreserveSingleQuotes(Arguments.strSelectAttributes)#
Run Code Online (Sandbox Code Playgroud)
此函数阻止ColdFusion自动转义单引号.
顺便说一句,任何其他函数调用都会做同样的事情.尝试:
SELECT #LCase(Arguments.strSelectAttributes)#
Run Code Online (Sandbox Code Playgroud)
这意味着PreserveSingleQuotes()实际上只是一个将字符串转换为函数结果的无操作,从而阻止自动变量插值例程的发生.
在变量周围调用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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2628 次 |
| 最近记录: |