XSSfilter删除所有脚本

我正在为我的Web应用程序实现一个XSSfilter,并使用ESAPI编码器来清理输入。

我使用的模式如下所示,

// Script fragments Pattern.compile("(.*?)", 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("", Pattern.CASE_INSENSITIVE), Pattern.compile("", 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?; 警报( ‘你好’);

我该如何处理?

这不是正确的方法。 在数学上不可能编写能够正确地使用XSS的正则表达式。 (正则表达式是“常规”,但HTML和Javascript都是无上下文的语法。)

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

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

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

这是Jersey 2.x的XSSfilter实现: 如何在Jersey 2中修改QueryParam和PathParam