7

所以,我认为我是一个“资深”的 ASP.NET WebForms 开发人员;但是,我最近遇到了这个问题,并且(不愉快地)对输出没有转义感到惊讶:

<asp:Label Text='<%# Eval("UserData") %>' runat="server" />

成像 Eval 返回的位置"<h1>joke is on you"或对页面的正确呈现/安全性更有害的东西。

存在标签而不是<%# %>直接标签的原因是,正如错误地假定的那样,“UserData”的内容将被正确地转义为 HTML。然而,这显然不是这种情况,上述场景导致在<h1>HTML 标记中创建元素。

那么问题可以提炼为:

给定任意用户输入,即显示为“纯文本”,将数据插入页面(跨度)并正确转义的简单/可靠/安全方法是什么?

如上所述,它应该在数据绑定控件的上下文中运行。我知道HttpUtility.HtmlEncode,但我考虑仍然使用控件的想法 - 也许我错过了这个任务的标准控件 - 来安全地表示这种情况,而不需要包装Eval. 如果这是基于逻辑或经验的误导,最好将其包含在回复中。我不会否认我在这种情况下使用 Label 是完全不合适的。

不幸的是,由于需要在 SharePoint 2010 上下文中运行,我将 ASP.NET 用于 .NET 3.5,而不是ASP.NET 4。

4

3 回答 3

5

关于什么:

<asp:Label Text='<%#: Eval("UserData") %>' runat="server" />

这会转义 eval 的输出,这仅适用于 .NET 4。

对于 .NET 3.5,解决方案可以是:

代码隐藏:

public object EvalEncode(object container, string expression)
{
  string ouput = DataBinder.Eval(container, expression).ToString();
  return HttpUtility.HtmlEncode(ouput);
}

标记:

<%# EvalEncode(Container.DataItem, "Text") %>

与其使用HttpUtility.HtmlEncode,不如使用 AntiXSS 库。对于 .NET 4 用户,它已经支持到框架中。

于 2012-09-06T18:26:30.847 回答
4

您可以使用<asp:Literal ...></asp:Literal>控件而不是标签。文字有一个Mode属性,您可以使用它来告诉控件对其输出进行 html 编码。

而不是这个:

<asp:Label Text='<%# Eval("UserData") %>' runat="server" />

尝试使用:

<asp:Literal Text='<%# Eval("UserData") %>' Mode="Encode" runat="server"></asp:Literal>
于 2012-09-06T19:27:41.163 回答
0

为此,请使用 microsoft 提供的Microsoft Web Protection Library (Anti-XSS library)。

安全很难,不要试图自己做。总有一些更聪明的黑客。

您可以按如下方式使用它:

<asp:Label Text='<%= Microsoft.Security.Application.AntiXss.HtmlEncode(Eval("UserData")) %>' runat="server" />
于 2012-09-06T18:28:13.057 回答