Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET 4.0列表框问题与HtmlEncoded列表项_C#_Asp.net - Fatal编程技术网

C# ASP.NET 4.0列表框问题与HtmlEncoded列表项

C# ASP.NET 4.0列表框问题与HtmlEncoded列表项,c#,asp.net,C#,Asp.net,在传统的ASP.NET 4.0应用程序中,我们正在针对各种安全问题进行更新,但包含HtmlEncoded项的列表框和下拉列表存在问题。对于包含撇号的ListItem文本值,浏览器无法识别ListBox和DropDownList中的编码,因此在呈现时无法将文本解码回撇号 对于请求的示例: 以Test.aspx为例 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>

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

对于请求的示例:

以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>
结果页面显示如下:

在发布的SO问题(非常类似)中,OP选择了一个答案,只是承认Microsoft在ASP.NET 4.0发布时将撇号编码记录为一个更改。然而,对于我们来说,这个答案并不能解决浏览器端的渲染问题,我们已经在IE11和FireFox中看到了这一点。也就是说,编码本身确实没有问题,但编码并不一致

对我们来说,更进一步的问题是,应用程序的某些方面在列表框之间移动编码数据,以便在回发时提交,而未解码撇号的存在则会导致ASP.NET反XSS检查在请求上引发异常,认为该值是恶意的,而实际情况并非如此。如果删除编码,则回发成功

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


是否有其他一些简单/明显的解决方法或设置我只是忽略了克服这个问题?我搜索过SO和其他一些网站,它们间接地从一般意义上讨论了撇号问题,但似乎没有一个网站针对ASP.NET 4.0提供了一致的解决方案

虽然我意识到这个问题没有得到太多的回应,但我将在这里提出一些额外的发现,这些发现几乎构成了一个答案,有助于维护传统ASP.NET 4.0站点的其他人

原始帖子中说明的真正问题是列表框中的项目正在进行双重编码。这源于源代码中所示的初始显式HtmlEncoding,加上在渲染时调用的附加HtmlEncode

我们认为,问题在于,ASP.NET 4.x系列控件在呈现时会自动调用HtmlEncode

当我们注意到一个简单的ListBox控件的页面呈现内容包含一个在显式HtmlEncode调用中包装的文本中带有符号和的项时,我们做出了这个推断,该页面的呈现内容实际上使用了硬“&”,这意味着它已经被HtmlEncoded

ASP文本框下拉列表列表框控件在呈现时对其内容进行HTML编码。ASP标签控件不可用。GridView控件有一个属性,该属性显式启用/禁用HtmlEncoding。这些控件的Html等价物,例如使用runat=“server”属性修改的传统Html元素,也在渲染时进行Html编码

底线是,除了上面列出的问题之外,关于给定控件是否对其易受攻击的内容进行HtmlEncodes的任何问题都只能通过测试所讨论的控件来绝对

当我发现有关确定哪些控件提供自己的编码的更多信息时,我将更新此信息

编辑:

附加测试表明,在标记中显式设置值或以编程方式添加/定义值时,以下两个控件都是HtmlEncoded的:

  • 指定“runat='server'”时的HTML输入类型='hidden'标记
  • ASP:HiddenField控件
我强烈怀疑,但尚未测试,任何带有runat='server'的本机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"));

    }
}