gpt4 book ai didi

c# - 带有 HtmlEncoded ListItems 的 ASP.NET 4.0 ListBox 问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:56:18 25 4
gpt4 key购买 nike

在旧版 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

在发布的 SO 问题中 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 的一致解决方案。

最佳答案

虽然我意识到这个问题没有得到太多回应,但我将在此处添加一些额外的发现,几乎构成了对可能处于维护位置的任何人的利益的答案旧版 ASP.NET 4.0 站点。

原始帖子中说明的真正问题是 ListBox 中的项目被双重编码。这是由源代码中说明的初始显式 HtmlEncoding 引起的,加上一个额外的显然在呈现时调用的 HtmlEncode。

我们认为,问题是很多,但显然不是所有,股票 ASP.NET 4.x 系列控件自动呈现时调用 HtmlEncode。

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

似乎 ASP TextBoxDropDownListListBox 控件在渲染。 ASP Label 控件GridView 控件具有显式启用/禁用 HtmlEncoding 的属性。这些控件的 Html 等价物,例如使用 runat="server" 属性修改的传统 HTML 元素,也在呈现时进行 HtmlEncoded。

底线是,除了上面列出的那些之外,关于给定控件是否 HtmlEncodes 其易受攻击的内容的任何问题只能通过测试相关控件来绝对知道。

当我发现更多关于确定哪些控件提供自己的编码的信息时,我会更新它。

编辑:

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

  • 当指定“runat='server'”时,HTML input type='hidden' 标签
  • ASP:HiddenField 控件

我强烈怀疑,但尚未测试,任何带有 runat='server' 的 native HTML 控件都会有类似的行为。

关于c# - 带有 HtmlEncoded ListItems 的 ASP.NET 4.0 ListBox 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48870513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com