XSS过滤器删除所有脚本

时间:2015-07-09 05:36:21

标签: java regex security xss esapi

我正在为我的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;的警报( '你好');

我该如何处理?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

您可以结合使用ESAPI和JSoup来清除所有XSS漏洞。当构建其他库来为您处理时,我肯定会避免尝试手动编写所有正则表达式。

以下是Jersey 2.x的XSS过滤器实现:How to Modify QueryParam and PathParam in Jersey 2