转义HTML实体并避免WebForm标签中的HTML注入?

6 asp.net webforms escaping html-entities

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

<asp:Label Text='<%# Eval("UserData") %>' runat="server" />
Run Code Online (Sandbox Code Playgroud)

Eval返回的映像"<h1>joke is on you"或对页面的正确呈现/安全性更恶意的映像.

有一个Label而不是<%# %>直接的原因是,正如错误推测的那样,"UserData"的内容将被正确地转义为HTML.但是,显然并非如此,上述方案导致在<h1>HTML标记中创建元素.

然后问题可以提炼为:

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

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

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

Erw*_*win 5

关于什么:

<asp:Label Text='<%#: Eval("UserData") %>' runat="server" />
Run Code Online (Sandbox Code Playgroud)

这会逃避eval的输出,这只适用于.NET 4.

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

代码隐藏:

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

标记:

<%# EvalEncode(Container.DataItem, "Text") %>
Run Code Online (Sandbox Code Playgroud)

HttpUtility.HtmlEncode使用AntiXSS库可能更好,而不是使用.对于.NET 4用户,它已经被支持到框架中.

  • "伟大的思想认为相似或傻瓜......":-)这是我刚刚实现的(谢天谢地我所有的用户控件共享一个共同的基类,所以很容易),但略有不同,我有一个方法`string HtmlEncode(object值)`所以调用是'HtmlEncode(Eval("Text"))`.显然必须使用`Container.DataItem`并不适合我(如果有一种方法以*动态范围的方式访问它*,这将是非常整洁!) (2认同)