由于可能的代码注入,Coldfusion 替代 evaluate()?

Coldfusion alternative to evaluate() due to possible code injection?

目前刚刚完成代码审查,审计员不喜欢这种使用方式 evaluate() 并由于可能的代码注入而将其指定为高风险。

向用户呈现与其帐户关联的一种产品形式。有一个带有 valuelist 产品 ID 的隐藏输入。然后有无线电输入来改变产品的状态。可能列出 1 到几种产品。这些输入都命名为 r_#productid#:

<form>
   <input type="hidden" name="prodIdList" value="#valueList(prodIds)#"/>
   <input type="radio" id="dn_#pr_prid#" name="r_#pr_prid#" value="X" checked="checked"/>
   <input type="radio" id="dn_#pr_prid#" name="r_#pr_prid#" value="P"/>
   <input type="radio" id="dn_#pr_prid#" name="r_#pr_prid#" value="L"/>
</form>

提交时,代码循环遍历 form.prodIdList 并评估这些 ID 以获得提交的值(X、P 或 L)。

<cfif StructKeyExists(FORM,"doProcessChanges")>
  <cfloop list="#FORM.assetIdList#" index="i">
    <cfswitch expression="#Evaluate('FORM.r_' & i)#">
      <cfcase value="P">
        --- do something i=productId ---
      </cfcase>
      <cfcase value="L">
        --- do something else i=productId  ---  
      </cfcase>
    </cfswitch> 
  </cfloop>
</cfif>

是否有不使用 Evaluate 并能满足该代码审阅者要求的替代方法?

[edit] 我所做的一项更改是评估然后检查值与预期列表或正则表达式。我没有想到数组表示法,也会尝试一下。现在这是第一次更新:

gender = evaluate('form.gender_' & i);
    if( gender == 'M' || gender == 'F' || gender == 'O' || gender == 'X' ) {
    -- do stuff
    } else {
    -- error 
    };

您可以使用这样的数组表示法 FORM['r_' & i] 而不是 Evaluate('FORM.r_' & i)。我认为这是一个重复的问题。如果能找到原件我会标记

可以使此代码更安全的方法之一是使用 encodeForHTMLAttribute()

此外,它的范围应该是生成它的任何内容。我想象一个查询创建了这个,所以应该使用查询的名称

<form>
   <input type="hidden" name="prodIdList" value="#EncodeForHTMLAttribute(valueList(qry.prodIds))#"/>
   <input type="radio" id="dn_#EncodeForHTMLAttribute(qry.pr_prid)#" name="r_#EncodeForHTMLAttribute(qry.pr_prid)#" value="X" checked="checked"/>
   <input type="radio" id="dn_#EncodeForHTMLAttribute(qry.pr_prid)#" name="r_#EncodeForHTMLAttribute(qry.pr_prid)#" value="P"/>
   <input type="radio" id="dn_#EncodeForHTMLAttribute(qry.pr_prid)#" name="r_#EncodeForHTMLAttribute(qry.pr_prid)#" value="L"/>
</form>