我有一个问题,我正在尝试清理请求内容以删除HTML和javascript(如果包含在输入参数中)。
这基本上是为了防止XSS攻击,理想的机制是验证输入并对输出进行编码,但由于某些限制,我无法在输出端工作。
此时我所能做的就是尝试通过过滤器清理输入。我正在使用ESAPI规范化输入参数,并使用jsoup和最严格的Whitelist.none()选项来删除所有HTML。
只要恶意javascript在某些HTML标记中,但是对于带有javascript代码但没有任何HTML的URL的URL失败,这是有效的,例如:
http://example.com/index.html?a=40&b=10&c='-prompt``-'
最终在页面上显示警告。这就是我现在正在做的事情:
param = encoder.canonicalize(param, false, false);
param = Jsoup.clean(param, Whitelist.none());
所以问题是:
答案 0 :(得分:2)
声明:
如果在面向互联网的解决方案中不允许输出转义,那么您将处于一个无法获胜的场景中。这就像Windows上的防病毒软件:您将能够检测到特定的和已知的攻击,但您将无法检测到未知 攻击。如果您的雇主坚持这条道路,您的尽职调查就是让管理层意识到这一事实,并以书面形式接受 的风险。 每次我遇到管理层时有了它,他们选择了正确的解决方案 - 输出转义。
=============================================== =================
首先关闭... watch out when using JSoup in any kind of a cleaning/filtering/input validation situation.
收到无效的HTML后,例如
<script>alert(1);
Jsoup将添加缺少的</script>
标记。
这意味着如果您使用Jsoup“清理”HTML,它会在开始处理之前首先将INVALID HTML转换为VALID HTML。
所以问题是:我有什么方法可以确定 我的输入被删除了所有的HTML和JavaScript代码 过滤?我应该投入一些正则表达式验证,但有没有 正则表达式将处理通过检查的案件 我现在有吗?
没有。 ESAPI和ESAPI的输入验证不适合您的用例,因为HTML is not a regular language和ESAPI的验证输入是正则表达式。事实是你不能做你所要求的事情:
有什么方法可以确保我的输入是 在过滤器上删除了所有HTML和javascript代码?
并且仍然有一个功能正常的Web应用程序,需要用户定义的HTML / JavaScript。
你可以稍微有利于堆栈:我会选择像OWASP's HTML Sanitizer.这样的东西,并根据列出的here测试你的实现。
其中许多输入来自OWASP的XSS Filter逃避备忘单,并且至少会针对已知的尝试执行您的应用程序。但是如果没有输出转义,你永远不会安全。
===================评论更新==================
所以用例是尝试阻止所有 html和javascript。我的建议是实现caja,因为它封装了HTML,CSS和Javascript。
虽然Javascript也很难通过输入验证进行管理,因为像HTML一样,JavaScript是一种非常规语言。此外,每个浏览器都有自己的实现,与ECMAScript规范的方式不同。如果您想保护您的输入不被解释,这意味着您理想情况下必须为每个浏览器系列提供解析器,以尝试解释用户输入以阻止它。
当你真正要做的就是确保输出被转义。很抱歉击败死马,但我必须强调,输出转移比拒绝用户输入重要100倍。你想要两者,但如果被迫选择其中一个,输出转义总体上就不那么重要了。