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

Posted

技术标签:

【中文标题】DropDownList (WebControls) 上的默认 .NET 清理【英文标题】:Default .NET sanitization on DropDownList (WebControls) 【发布时间】:2018-05-20 12:24:06 【问题描述】:

我正在使用遗留代码 - 带有一些 .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】:

ListControls 中的值通常是整数,如果你可以重构它,它将更易于维护以应对未来的任何变化。如果您想快速修复,您可能需要对 html 部分进行编码:

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

更新(基于您的评论):

如果您查看显示 html 标签的选择标签,您是否见过显示 html 标签的选择标签?我敢打赌选择标签是隐藏的,它是为了页面中的一些逻辑。通常选项标签中的值属性是整数或代码之类的一个词:

<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>

【讨论】:

文档中是否以某种方式提到了这一点?我的意思是,在与首席设计师讨论这个问题时,我需要一些支持。 @Tenso 熟悉您使用的控件很重要,我使用一组通用控件并且知道(通过个人测试)它们是否自动编码。至于官方文档,MSDN ListBox Class 页面确实包含有关此特定问题的“警告”警告。 @Tenso 还有一个旧帖子 (2008) Which ASP.NET Controls Automatically Encodes? 这确实包含 WebControl 列表以及它们是否自动进行任何编码。此列表很旧,我建议您自己在示例项目中测试控件。 @daniel-b 我知道这看起来不正常,但重构的情况并非如此。这个应用程序非常复杂,一些控件是由属性框架生成的,数据取自数据库。所以我不能把我想要的任何东西放在这些属性中。此问题出现在自动 xss 测试期间,因此可能也是验证问题。但我相信,好的做法是不仅仅依赖一种安全措施,因此验证会得到改进,但我也认为,应该在这个特定的控件上实现某种编码。

以上是关于DropDownList (WebControls) 上的默认 .NET 清理的主要内容,如果未能解决你的问题,请参考以下文章

asp.net的DropDownlist绑定数据

未能找到类型或命名空间“xxx"(是不是缺少using指令或程序引用?怎么回事?

出现错误Microsoft.Web.UI.WebControls

如何更改 FileUpload 控件 (System.Web.UI.WebControls) 中浏览按钮的文本

Telerik.WebControls.RadAjaxManager 导致下拉列表不触发处理程序

System.Web.UI.WebControls.Unit 的行为