【发布时间】: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 使用这种方法,我仍然可以使用自动模糊器攻击您的应用程序,并不断发现您从未处理过的极端情况。输入清理应该是一种纵深防御策略,在您已经确保正确的输出转义之后应用。
-
你也没有展示你是如何使用这些表达式的。请注意,您不只是进行非递归删除,因为从
<scr<script>ipt>alert('test')</scr</script>ipt>中删除<script>在第一次通过后仍会留下<script>alert('test')</script>。大多数框架和语言已经内置了用于编码和解码特殊字符的函数。这绝不是一个新问题,所以你应该质疑你是否真的需要重新发明轮子。
标签: java regex security xss esapi