我有一个不幸的任务,清理一堆旧的ColdFusion代码.查询到处都是,我正在努力将它们全部转移到普通的CFC上以便于维护.
我遇到了一个问题,因为cfquery会自动将单引号转换为双引号.我该如何覆盖这种行为?
更具体的信息如下.
所以这是我开始的查询:
<cfquery name="getobjectInfo" datasource="#BaseDS#"> SELECT groupName AS lastname,'[Group]' AS firstname FROM groups WHERE groups.group_id = #objectreference_id# </cfquery>
这里奇怪的是文字被“选中”,因为我们希望它被显示的方式(再次,我没有写这个,我只是想把它清理一下).所以在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>
这是问题:当我为strSelectAttributes参数传入“GroupName AS LastName,'[Group]’AS FirstName”时,发送到数据库的查询是:
SELECT GroupName AS LastName,''[Group]'' AS FirstName FROM Groups WHERE Group_ID = 4
解决方法
ColdFusion不会转义所有单引号,只会转义那些通过变量插值到达查询的引号.这是罪犯:
SELECT #Arguments.strSelectAttributes#
这通常是一个有用的东西和一小段防御sql注入攻击.因此,规则一是(此处和其他地方):不要从变量构建sql字符串.
如果您必须使用变量来构建sql字符串,尽管存在所有可能的负面影响,请使用PreserveSingleQuotes()函数:
SELECT #PreserveSingleQuotes(Arguments.strSelectAttributes)#
SELECT #LCase(Arguments.strSelectAttributes)#
这意味着PreserveSingleQuotes()实际上只是一个将字符串转换为函数结果的无操作,从而阻止自动变量插值例程的发生.
原文地址:https://www.jb51.cc/mssql/84192.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。