【问题标题】:spring security native xss filterspring security原生xss过滤器
【发布时间】:2016-03-11 22:33:08
【问题描述】:

为什么 Spring Security 不提供任何 XSS 过滤器来清理表单输入值?

根据这张票,这样的 XSS 过滤器是低优先级的: https://jira.spring.io/browse/SEC-2167?jql=text%20~%20%22xss%22

(尽管票证只涉及 URL 查询字符串。还需要清理 POST 参数)

在我看来,spring 提供这样的过滤器而不是自己构建过滤器会非常有用。这个过滤器是一个经常出现的问题。

【问题讨论】:

  • 如果您将任何用户输入的数据插入到 HTML 页面中而没有正确转义,您就会遇到安全问题,并且像“C&A”这样的无辜文本将无法正常工作。如果你正确地转义它,你就不需要 XSS 过滤器。
  • 但这是 spring 可以处理的事情,因此程序员不必关心转义。好处:1)您不必重构遗留应用程序 2)您不必关心转义 3)您可能更喜欢清理而不是转义

标签: spring-security xss


【解决方案1】:

XSS 最好在输出阶段通过使用编码来处理。也就是说,将所有内容按原样存储在您的数据库中,是的,存储 <script> 很好,但是一旦输出,请针对输出的上下文正确编码。对于 HTML,这将是 <script>,但是如果您的输出上下文是普通的您将按原样输出的文本<script>(假设使用相同的字符集编码)。 旁注:使用参数化查询或等效查询存储在数据库中以避免 SQL 注入,但存储的文本应与输入的内容完全匹配。

Microsoft 试图通过 ASP.NET 中的请求验证功能来阻止看起来像 XSS 的输入。但是,这不是很有效,flaws 经常是found。其他框架的类似方法注定要失败。

这更好的原因是它使事情变得更简单。想象一下,如果 StackOverflow 不允许 HTML 或脚本标签 - 该网站将无法作为人们发布代码 sn-ps 的地方。

可以使用输入验证作为第二道防线。例如,如果您要求用户输入他们的汽车注册信息,您可能只想允许输入字母数字和空格。但是,对于更复杂的字段,通常很难将输入限制为安全集,因为在此阶段输出上下文是未知的。

说你的语言过滤了<> 字符。但是,您将用户输入输出到以下上下文中。

<img src="foo.jpg" alt="USER-INPUT" />

输入" onmouseover="alert('xss') 可能会引发 XSS 攻击,因为它会被渲染为

<img src="foo.jpg" alt="" onmouseover="alert('xss')" />

如果您要输出到 JavaScript 服务器端,也会出现类似的问题。这就是为什么在使用用户控制的值时应该由开发人员选择正确的编码类型。

【讨论】:

  • 我同意在某些情况下,例如您放置的 html 编辑器或事件处理程序需要特别注意,但总的来说,我仍然认为原生输入过滤器会很有用。我也喜欢你关于字段限制的评论,让我认为使用注释验证字段可能是过滤 xss 的另一种方式
  • 原生输入过滤器也不能防止来自其他来源的输出 - 例如通过另一个应用程序填充的数据库。我认为本机过滤器往往会向开发人员隐藏问题并导致其他有效输入出现问题(例如,.NET 有时会阻止输入的&lt; 字符,从而产生错误)。如果开发人员知道 XSS,并且他们应该在输出阶段处理它,我认为这将是解决它的更好方法。
猜你喜欢
  • 2019-04-13
  • 2016-06-24
  • 2013-04-13
  • 2011-08-23
  • 2015-10-13
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
相关资源
最近更新 更多