HtmlEncoded ListItems

时间:2018-02-19 16:41:42

标签: c# asp.net

在我们正在更新各种安全问题的旧版ASP.NET 4.0应用程序中,我们遇到包含HtmlEncoded项目的列表框和下拉列表的问题。对于包含撇号的ListItem文本值,浏览器无法识别列表框和下拉列表中的编码,因此在呈现时无法将文本解码回撇号。

对于请求的示例:

考虑Test.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
    <form id="form1" runat="server">
    <div>
       <asp:ListBox runat="server" ID="TheListBox" ></asp:ListBox>
    </div>
    </form>
</body>
</html>

其代码隐藏:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

       TheListBox.Items.Add(new ListItem("&#39;hello&#39;", HttpUtility.HtmlEncode("hi")));
       TheListBox.Items.Add(new ListItem(HttpUtility.HtmlEncode("David's Test"), "hi"));

    }
}

结果页面如下所示:

Test.aspx output

在发布的问题here非常相似的情况下,OP选择了一个答案,仅仅承认Microsoft在发布ASP.NET 4.0时将撇号的编码记录为更改。但是,对于我们来说,这个答案并没有解决浏览器方面的呈现问题,我们在IE11和FireFox中已经看到过这个问题。也就是说,我们对编码本身没有任何问题,但事实上编码并没有得到一致的尊重。

我们的另一个问题是,我们的应用程序的某些方面在列表框之间移动编码数据以便在回发时提交,然后非解码撇号的存在会导致ASP.NET反XSS检查在请求,认为价值是恶意的,当它不是。如果删除了编码,则回发成功。

该站点已设置为在web.config中呈现具有.Net 3.5兼容性的控件。我们已经尝试完全删除它,然后显式设置为4.0(可能是默认设置),这两者都没有任何区别。我已经考虑过滚动我自己的HtmlEncode覆盖来忽略包含撇号的字符串,但对于大多数浏览器按预期在非列表框实体上呈现编码标记的情况(例如文本框和标签),这似乎是严苛的。

是否有一些其他简单/明显的解决方法或设置我只是忽略了解决这个问题?我一直在搜索SO和其他间接讨论撇号问题的网站,但似乎都没有一个特定于ASP.NET 4.0的一致解决方案。

1 个答案:

答案 0 :(得分:0)

虽然我发现这个问题没有得到很多答复,但我还是会在这里提出一些额外的发现,几乎构成一个答案,以造福其他人。维护旧版ASP.NET 4.0站点的位置。

原帖中说明的真正问题是ListBox中的项目是双重编码。这源于源中所示的初始显式HtmlEncoding,加上一个额外的显然在渲染时被调用的HtmlEncode。

我们认为,问题在于很多,但显然不是所有,自动存储ASP.NET 4.x系列控件 渲染时调用HtmlEncode。

我们在注意到具有简单ListBox控件的页面的呈现内容时进行了这种推断,其中包含带有&符号的项目,其中包含在显式HtmlEncode调用中的文本实际上是用硬的&#39; &amp;&#;;暗示它已经已被HtmlEncoded。

似乎ASP TextBox DropDownList ListBox 控制 HtmlEncode他们的内容时渲染。 ASP 标签控件 GridView 控件具有显式启用/禁用HtmlEncoding的属性。这些控件的Html等价物,例如使用 runat =&#34;服务器&#34; 属性修改的传统HTML元素,在渲染时也是HtmlEncoded。

最重要的是,除了上面列出的内容之外,任何有关给定控件HtmlEncodes其易受攻击内容的问题都只能通过测试相关控件来绝对知道。

我将更新此内容,因为我发现了有关确定哪些控件提供自己的编码的更多信息。

修改

其他测试显示以下两个控件都是HtmlEncoded,当值在标记中显式设置或者以编程方式添加/定义时:

  • HTML输入类型=&#39;隐藏&#39;标记何时&#34; runat =&#39;服务器&#39;&#34;已指定
  • ASP:HiddenField控件

我强烈怀疑,但尚未测试任何使用runat =&#39; server&#39;的本机HTML控件。表现相似。