小编典典

如何在ColdFusion中覆盖SQL清理

sql

我有一个不幸的任务,就是清理一堆旧的ColdFusion代码。查询无处不在,我正在努力将它们全部移至常见的CFC,以便于维护。

我遇到了一个问题,因为cfquery它会自动将单引号转换为双单引号。如何覆盖该行为?

更具体的信息如下。


所以这是我开始的查询:

<cfquery name="getObjectInfo" datasource="#BaseDS#">
  SELECT groupName AS lastname, '[Group]' AS firstname
  FROM   groups
  WHERE  groups.group_id = #objectreference_id#
</cfquery>

奇怪的是,由于要显示文字,所以正在“选择”一个文字(再次,我没有写这个,我只是想稍微清理一下)。因此,在通用函数中,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>

这是问题所在 :当我传递"GroupName AS LastName, '[Group]' AS FirstName"strSelectAttributes参数时,发送到数据库的查询是:

SELECT GroupName AS LastName, ''[Group]'' AS FirstName
FROM   Groups
WHERE  Group_ID = 4

您会发现,我的报价已被“清除”为无效查询。


阅读 172

收藏
2021-03-23

共1个答案

小编典典

ColdFusion不会转义 所有 单引号,而是仅转义通过变量插值到达查询中的那些单引号。这是罪犯:

SELECT #Arguments.strSelectAttributes#

这通常是有帮助的事情,并且可以抵御SQL注入攻击。因此,第一条规则是(在这里和其他地方):不要从变量构建SQL字符串。

如果 肯定要 使用变量来构建SQL字符串,尽管有所有可能的负面影响,请使用以下PreserveSingleQuotes()函数:

SELECT #PreserveSingleQuotes(Arguments.strSelectAttributes)#

此功能阻止ColdFusion自动转义单引号。

顺便说一句,任何其他函数调用都做同样的事情。尝试:

SELECT #LCase(Arguments.strSelectAttributes)#

这意味着PreserveSingleQuotes()实际上只是一个无操作,它将字符串转换为函数结果,从而防止了自动变量插值例程的发生。

2021-03-23