Security 评估的备选方案

Security 评估的备选方案,security,coldfusion,coldfusion-9,evaluate,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

审计显示,我们使用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>

您将需要使用getvalue[url.column][1],这样您将进入getvalue查询的第1行,否则将出现错误。Peter在SQL注入问题上也是正确的。至少您需要在查询中使用

您不应该在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>
如果你真的要运行SQL,那就是动态的,下面是我要做的。在ApplicationStart上,您可以使用cfdbinfo查询数据库中的表列表的数据库元数据,并将它们存储在应用程序范围中

您可以编写一个函数,该函数接受URL.table并检查它是否存在于列表中。如果未列出,它可能会抛出错误


同样的方法也适用于列。这将检查您的表/列是否存在,但如果您只想允许访问某些表/列,那么您没有选择存储某种列表或别名集,正如AlexP和Peter所建议的那样。

括号表示法:getvalue[url.column],你需要使用和阻止HTML/JS注入,并且你已经在查询中使用了所有url.stuff的SQL注入。我不确定是否可以避免url.stuff-页面是动态的,我们必须查找列、表等。你有什么建议?确保它是已知/预期值-AlexP显示了下面的一个选项,但您也可以使用白名单,例如与ListFind一起使用。然而,您拥有动态列、表和id名称这一事实确实会引起注意——您在这里实际想做什么?如果是某种类型的数据库管理系统,可能有一个现有的工具解决了问题,并且已经解决了安全问题。即使只有一行可能?此代码当前执行查询,即使值为空-需要检查是否失败。虽然为了便于维护,我可能会做一些不同的事情-例如,将别名数据创建为结构或动态生成,然后使用一个url.alias字段…例如:是的,我同意,这是一个非常简单的例子,我只是想说明我在注入方面的观点,并提供一个可能的解决方案。使用别名的另一个好处是避免暴露实际的db模式。