由于可能的代码注入,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>
目前刚刚完成代码审查,审计员不喜欢这种使用方式 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>