Альтернатива Coldfusion для оценки () из-за возможного внедрения кода? - PullRequest
0 голосов
/ 01 ноября 2018

В настоящее время просто завершается проверка кода, и аудитору не нравится это использование evaluate() и он назначает высокий риск из-за возможного внедрения кода.

Пользователю предоставляется форма продуктов, связанных с его учетной записью. Есть скрытый ввод с valuelist идентификаторами продукта. Затем есть радиовходы для изменения статуса продуктов. Там может быть от 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 и вычисляет эти идентификаторы для получения переданного значения (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 и удовлетворит этого рецензента кода?

[править] Одно изменение, которое я сделал, состояло в том, чтобы оценить и затем сравнить значения с ожидаемым списком или регулярным выражением. Я не думал о нотации массивов и попробую это сделать. А пока вот первое обновление:

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

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Чтобы сделать этот код более безопасным, можно использовать 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>
0 голосов
/ 01 ноября 2018

Вы можете использовать обозначение массива как FORM['r_' & i] вместо Evaluate('FORM.r_' & i). Я думаю, что это дублирующий вопрос. Я отмечу, если смогу найти оригинал.

...