【问题标题】:Do we still need to disable request validation when using Razor?使用 Razor 时我们还需要禁用请求验证吗?
【发布时间】:2015-01-05 12:22:10
【问题描述】:

在 ASP.NET MVC 视图中,通常使用 Razor 的语法绑定模型值:

@Html.DisplayFor(m => m.Name)

我们知道 Razor 默认会对值进行 html 编码。但想象一个恶意用户在文本框中输入脚本并提交:

<script>alert('Executing evil script')</script>

现在,如果我们不使用[ValidateInput(false)][AllowHtml] 属性,我们将遇到HttpRequestValidationException,这意味着每次用户提交表单时都必须捕获此异常。

从另一个 stackoverflow question 的答案中,我知道我们可以在应用程序级别禁用请求验证,但许多人认为这是一种不好的做法。

我的问题是,鉴于我们有 Razor 可以转义所有 &amp;gt;&amp;lt;,如果我们关闭请求验证,我们是否可以假设该站点仍然是安全的?

【问题讨论】:

  • 鉴于有 Html.Raw 我不确定 Razor 是如何决定使用或不请求验证的重要部分......它从来不是必需的,但如果你不期望它很有用邪恶脚本”作为输入。

标签: c# asp.net asp.net-mvc razor


【解决方案1】:

不,在 Razor 页面生成期间仅依赖 HTML 编码并关闭请求验证并不是对抗 XSS 攻击的好策略:

  • 请求验证首先防止错误的用户输入进入您的数据库/存储/其他用户屏幕。
  • Html 编码(清理)作为备份策略,例如攻击者已经穿过门的地方。
  • 考虑到应用程序可以提供的不仅仅是 Html - 例如。 Xml 和 REST 服务,不受 Html 助手编码的约束。 (例如,攻击者可能会找到将恶意负载放入 Xml CDATA 部分的方法)
  • 另外,请考虑对您的数据库运行常规 Sql / NoSql 查询,以寻找您的站点请求验证已被破坏的迹象。

【讨论】:

  • 那我怎样才能让用户安全地在文本框中输入&amp;lt;&amp;gt; 而不会导致应用程序因HttpRequestValidationException 而崩溃?
  • 你只允许 Html 的一个字段,使用主流的 Html 编辑器,如 *CKEditor 或 TinyMCE 等,configure 你的 Html 编辑器控件只允许特定的 Html 标签。没有脚本。并不是所有的 Html,否则攻击者仍然可以破坏您的网站。
  • @StuartLC:配置客户端编辑器并不能保护您的服务器免受恶意 HTML 的侵害。您需要验证服务器端的所有内容。这很难正确地做到。
猜你喜欢
  • 2018-06-07
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多