XSS过滤器删除所有脚本



我正在为我的web应用程序实现一个XSS过滤器,并且还使用ESAPI编码器对输入进行消毒。

我使用的模式如下所示,

 // Script fragments
Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE),
// src='...'
Pattern.compile("src[rn]*=[rn]*\'(.*?)\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
Pattern.compile("src[rn]*=[rn]*\"(.*?)\"", 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; 警报("你好");

我如何处理这些?

这不是正确的方法。从数学上讲,编写一个能够正确地支持XSS的正则表达式是不可能的。(Regex是"常规的",但HTML和Javascript都是与上下文无关的语法。)

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

如果你确实需要允许HTML/javascript进入你的应用程序,那么你需要一个web应用程序防火墙或像HDIV这样的框架。

最新更新