【问题标题】:XSS filter to remove all scriptsXSS 过滤器删除所有脚本
【发布时间】:2015-09-27 07:49:05
【问题描述】:

我正在为我的 Web 应用程序实现 XSS 过滤器,并且还使用 ESAPI 编码器来清理输入。

我使用的模式如下所示,

 // Script fragments
Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE),
// src='...'
Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
// lonely script tags
Pattern.compile("</script>", Pattern.CASE_INSENSITIVE),
Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
// eval(...)
Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
// expression(...)
Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
// javascript:...
Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE),
// vbscript:...
Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE),
// onload(...)=...
Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL)

但是,仍然有一些脚本没有被过滤,特别是那些附加到像

这样的参数的脚本

url?sourceId=abx;alert('hello');

我该如何处理这些?

【问题讨论】:

  • 目前尚不清楚该输入可能的攻击媒介是什么。在不知道您实际如何处理输入和输出的情况下,要求用户提出或检查您的输入卫生策略是不合理的。
  • 编码输出,而不是输入。 (这包括输出到 SQL 和 HTML 之类的东西。)
  • @Tom 说了什么。尝试在输入阶段修复注入问题,尤其是使用黑名单,是一种永远不可靠的策略。这是在浪费你的时间。
  • @CoolTechie 使用这种方法,我仍然可以使用自动模糊器攻击您的应用程序,并不断发现您从未处理过的极端情况。输入清理应该是一种纵深防御策略,您已经确保正确的输出转义之后应用。
  • 你也没有展示你是如何使用这些表达式的。请注意,您不只是进行非递归删除,因为从&lt;scr&lt;script&gt;ipt&gt;alert('test')&lt;/scr&lt;/script&gt;ipt&gt; 中删除&lt;script&gt; 在第一次通过后仍会留下&lt;script&gt;alert('test')&lt;/script&gt;。大多数框架和语言已经内置了用于编码和解码特殊字符的函数。这绝不是一个新问题,所以你应该质疑你是否真的需要重新发明轮子。

标签: java regex security xss esapi


【解决方案1】:

这不是正确的方法。 It's mathematically impossible to write a regex capable of correctly punting XSS.(正则表达式是“常规”,但 HTML 和 Javascript 都是上下文无关语法。)

但是,您可以保证当您切换上下文时(交出一段将要被解释的数据),该数据会为该上下文切换正确转义。因此,当向浏览器发送数据时,如果将其作为 HTML 处理,则将其转义为 HTML;如果将其处理为 javascript,则将其转义为 Javascript。

如果您确实需要允许 HTML/javascript 进入您的应用程序,那么您将需要一个 Web 应用程序防火墙或 HDIV 之类的框架。

【讨论】:

  • It's mathematically impossible to write a regex capable of correctly punting XSS。也就是说,当然假设正则表达式引擎严格遵守正则表达式。大多数引擎没有。
  • @Rob 您能否分享一个正则表达式实现的示例,其中常规语言已转换为上下文无关语法?
猜你喜欢
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多