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

如果你真的必须运行那种动态的 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 回答
1

您将需要使用getvalue[url.column][1],因此您正在拉入getvalue查询的第 1 行,否则您将收到错误消息。彼得对 SQL 注入问题也是正确的。至少您需要<cfqueryparam>用于查询

于 2012-10-12T12:01:00.130 回答