5

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

ほら、私の引用符が無効なクエリに「サニタイズ」されました。

4

3 に答える 3

7

変数の周りに 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>
于 2009-06-02T16:00:03.787 に答える
-3

本当にコードをクリーンアップしたい場合は、ステップ 2 でそのスパゲッティをストアド プロシージャに変換します。

于 2009-07-17T15:52:39.367 に答える