1

任意のコードの実行を許可するため、評価の使用に脆弱性があることが監査で明らかになりました。誰かが代替品を持っていますか?以下の例。CF9を実行しています。

<cfquery name="getvalue" datasource="#application.ds#">
   SELECT     #url.column#
   FROM         dbo.tbl#url.table#
   WHERE     (int#url.table#Id = <CFQUERYPARAM Value="#url.Id#">)
</cfquery>

<cfif url.rowtype eq "text">
    <cfoutput>
    <input type="text" id="focus#url.table##url.column##url.Id#" 
        name="#url.table##url.column##url.Id#" 
        value="#evaluate('getvalue.#url.column#')#" 
        class="inputtext"
        onblur="updateeditvalue('#url.rowtype#','#url.table#','#url.column#',#url.Id#
                    ,escape(this.form.#url.table##url.column##url.Id#.value))" 
        style="height:20px;width:500px;">
    </cfoutput>
<cfelseif url.rowtype eq "textarea">
     <cfoutput>
     <textarea id="focus#url.table##url.column##url.Id#" 
        name="#url.table##url.column##url.Id#" 
        class="inputtext" style="height:20px;width:500px;"
        onblur="updateeditvalue('#url.rowtype#','#url.table#','#url.column#',#url.Id#
                     , escape(this.form.#url.table##url.column##url.Id#.value))">
          #evaluate('getvalue.#url.column#')#
    </textarea>
    </cfoutput>
</cfif>
4

3 に答える 3

1

クエリgetvalue[url.column][1]の行1をプルするために使用する必要があります。そうしないと、エラーが発生します。getvaluePeterはSQLインジェクションの問題についても正しいです。少なくとも<cfqueryparam>、クエリに使用する必要があります

于 2012-10-12T12:01:00.130 に答える
1

本当に動的な SQL を実行する必要がある場合は、次のようにします。onApplicationStart では、cfdbinfo を使用してデータベース メタデータにクエリを実行し、データベース内のテーブルのリストを取得して、それらをアプリケーション スコープに格納します。

URL.table を受け取り、それがリストに存在することを確認する関数を作成できます。リストされていない場合、エラーが発生する可能性があります。

同じアプローチが列にも機能します。これにより、テーブル/列が存在することが確認されますが、特定のテーブル/列へのアクセスのみを許可したい場合は、AlexP と Peter が提案するように、ある種のリストまたは一連のエイリアスを保存することはできません。

于 2012-10-12T14:10:18.460 に答える
1

URL 内に列/テーブル/ID 列名を直接含めるべきではありません。これにより、SQL がインジェクションの対象になります。値にを使用したようですがcfqueryparam、クエリの残りの部分がこれを冗長にしています。

URL 経由でエイリアスを渡し、正しい列名を設定する必要があります。非常に簡単な例を以下に示します。

<cfset idColumn   = ""/>
<cfset columnName = ""/>
<cfset tableName  = ""/>

<cfif structKeyExists(url, "aliasForColumnA")>
  <cfset columnName = "the_real_column_name_a"/>
  <cfset tableName  = "the_real_table_name_a"/>
  <cfset idColumn   = "int" & #tableName# & "Id"/>
<cfelseif structKeyExists(url, "aliasForColumnB")>
  <cfset columnName = "the_real_column_name_b"/>
  <cfset tableName  = "the_real_table_name_b"/>
  <cfset idColumn   = "int" & #tableName# & "Id"/>
</cfif>

<cfquery name="getvalue" datasource="#application.ds#">
  SELECT
    #columnName#
  FROM
    #tableName#
  WHERE
    #idColumn# = <CFQUERYPARAM cfsqltype="CF_SQL_INTEGER" Value="#url.Id#"/>
</cfquery>
于 2012-10-12T12:06:12.403 に答える