asp.net-mvc - 标准 Html.DisplayTextFor() 没有 HTML 编码吗?

标签 asp.net-mvc xss

我们目前正在处理我们的 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/

相关文章:

php - 为什么 fetchArray 不直接应用 htmlspecialchars ?

javascript - 任何人都知道 Javascript 中有一个可靠的库/函数来清理用户输入

asp.net-mvc - MVC AJAX 属性验证

c# - MVC 4 中的等待屏幕

c# - bundle 的 css 链接出现 404 错误

php - 用户输入的带有 Javascript 的 HTML 显示给其他人但不是 HTML 转义的 XSS 示例

javascript - 为什么javascript是: URIs allowed in the src attribute of <img> tags?

javascript - 检查输入并将其转换为适当的类型以防止 XSS

jquery - 单击按钮上的 ajax 调用后,部分 View 刷新不起作用

asp.net-mvc - Timepicker 字段必须是日期 - 验证失败