目前,我们正在一个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; }
}
风景:
@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/> |||
DisplayTextFor的输出将是整个字符串
<script xss="" src="htpp://ha.ckers.org/css.js">
问题是:错误,功能或我使用错了吗?
最佳答案
Html.DisplayTextFor
实际上是用于与[DisplayFormat]
属性(see MSDN)进行交互的。
因此,如果将其与不安全的值一起使用,则必须意识到这一点,并在属性上使用[DisplayFormat(HtmlEncode = true)]
。
编辑:看起来HtmlEncode属性实际上不是由DataAnnotationsModelMetadataProvider(和DisplayTextFor)强制实现的。
关于asp.net-mvc - 标准Html.DisplayTextFor()是否没有HTML编码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9790557/