标准的Html.DisplayTextFor()没有HTML编码吗?

Rob*_*sig 7 xss asp.net-mvc

我们目前正在处理一个ASP.NET MVC项目中的一些XSS问题.我发现了两个问题 - 第一个问题与我们的请求验证模式有关.攻击者现在可以使用此安全漏洞删除数据库中的一些不良内容.

第二个问题是我们如何显示这个内容,我们使用Html.DisplayTextFor方法,它似乎"破碎".

只需创建一个新的MVC 3 WebApp,将其放在HomeController中:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">";

        User foo = new User();
        foo.Name = "<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">";

        return View(bla);
    }

    public ActionResult About()
    {
        return View();
    }
}

public class User
{
    public string Name { get; set; }
} 
Run Code Online (Sandbox Code Playgroud)

风景:

@Html.TextBoxFor(m => m.Name) <br/> ||| <-- will be encoded

@Html.Encode(ViewBag.Message)<br/> ||| <-- will be double encoded

@Model.Name <br/> ||| <-- will be encoded 

@Html.DisplayTextFor(m => m.Name) <-- no encoding
<br/> ||| 
Run Code Online (Sandbox Code Playgroud)

DisplayTextFor的输出将是整个字符串 <script xss="" src="htpp://ha.ckers.org/css.js">

问题是:错误,功能还是我使用它错了?

bha*_*lin 2

Html.DisplayTextFor实际上是为了与[DisplayFormat]属性交互(参见 MSDN)。

因此,如果您将其与不安全的值一起使用,则必须意识到这一点并[DisplayFormat(HtmlEncode = true)]在您的财产上使用。

编辑:看起来 HtmlEncode 属性实际上并不是由 DataAnnotationsModelMetadataProvider (和 DisplayTextFor)强制执行的。