评估的替代方案

时间:2012-10-12 11:31:36

标签: security coldfusion coldfusion-9 evaluate

审计在我们使用evaluate时出现了一个漏洞,因为它允许任意代码执行。有人有替代方案吗?以下示例。我们正在运行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>

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您不应该直接在URL中包含column / table / id列名,这样就会打开SQL for injection。我看到你使用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>

答案 2 :(得分:1)

如果你真的必须运行那个动态的SQL,这就是我要做的。 onApplicationStart使用cfdbinfo查询数据库元数据,获取数据库中的表列表,并将它们存储在应用程序范围内。

您可以编写一个获取URL.table并检查它是否存在于列表中的函数。如果没有列出,它可能会抛出错误。

同样的方法适用于列。这将检查您的表/列是否存在,但如果您只想允许访问某些表/列,则您无法选择存储某些列表或一组别名,如AlexP和Peter建议的那样。