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

时间:2018-11-01 12:31:26

标签: coldfusion coldfusion-2016

当前刚刚完成代码审查,审核员不喜欢使用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 
    };

2 个答案:

答案 0 :(得分:3)

您可以使用像Dog这样的数组符号代替FORM['r_' & i]。我认为这是一个重复的问题。如果可以找到原件,我会举报。

答案 1 :(得分:2)

可以使此代码更安全的事情之一就是使用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>