我们目前正在处理我们的 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; }
}
View :
@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/