DropDownList上的默认.NET清理(WebControls)

时间:2017-12-06 15:03:33

标签: c# asp.net security web-controls

我正在使用遗留代码 - 带有一些.NET的WebControls,遇到了XSS问题。 在我的代码背后,我已经在这样的foreach中添加了简单的DropDownList和ListItems:

 foreach (string enumValue in aEnumValues)
      pListBox.Items.Add(new ListItem(enumValue, enumValue));

但是,当生成dropDown时,选项的值属性不会被完全清理。响应正文中的选项如下所示:

<option selected="selected" value="&quot;>&lt;img src=2 onerror=alert(y65)>">&quot;&gt;&lt;img src=2 onerror=alert(y65)&gt;</option>
<option value="df">df</option>
<option value="&quot;dsdf>&lt;img src=2 onerror=alert(y65)> &quot;>&lt;img src=2 onerror=alert(y65)>    ">&quot;dsdf&gt;&lt;img src=2 onerror=alert(y65)&gt;    &quot;&gt;&lt;img src=2 onerror=alert(y65)&gt;  </option>

如您所见,对于值属性,并非所有字符都被转义。我怎样才能解决这个问题?或者这是WebControls的一些问题吗?

1 个答案:

答案 0 :(得分:1)

ListControls中的值通常是整数,如果您可以重构它,那么对于将来的任何更改都会更加可维护。如果你想快速修复,你可能需要编码html部分:

foreach (string enumValue in aEnumValues)
    pListBox.Items.Add(new ListItem(enumValue, Server.HtmlEncode(enumValue)));

更新(根据您的评论):

如果您查看显示html标签的select标签,您是否曾见过显示html标签的select标签?我敢打赌,select标签是隐藏的,它适用于页面中的某些逻辑。通常,option标签中的value属性是一个单词,如整数或代码:

<select id="card">
  <option value="visa">Visa</option>
  <option value="mc">Master card</option>  -- value is abbreviation of display text
  <option value="amex">American Express</option>
</select>
<select id="lstStates">
  <option value="CA">California</option>  -- value is state's code
  <option value="FL">Florida</option>
</select>
<select id="lstStaffs">
  <option value="1001">Daniel Smith</option>   --value is StaffId
  <option value="1008">John Doe</option>
</select>

enter image description here