我正在为我的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;的警报( '你好');
我该如何处理?
答案 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