从请求中过滤掉编码的 javascript 内容

filter out encoded javascript content from request

我在尝试清理请求内容以删除输入参数中包含的 HTML 和 javascript 时遇到问题。

这基本上是为了防止 XSS 攻击,理想的机制是验证输入并对输出进行编码,但由于某些限制,我无法在输出端工作。

此时我所能做的就是尝试通过过滤器清理输入。我正在使用 ESAPI 规范化输入参数,并使用具有最严格 Whitelist.none() 选项的 jsoup 来去除所有 HTML.

只要恶意 javascript 在某些 HTML 标签内,此方法就有效,但对于带有 javascript 代码且周围没有任何 HTML 的 URL 则失败它,例如:

http://example.com/index.html?a=40&b=10&c='-prompt``-' 

最终在页面上显示了一个警告。这就是我现在正在做的事情:

param = encoder.canonicalize(param, false, false);
param = Jsoup.clean(param, Whitelist.none());

所以问题是:

免责声明:

如果您的面向 Internet 的解决方案不允许输出转义,那么您将处于双赢场景。这就像 Windows 上的防病毒软件:您将能够检测到 特定的 已知的 攻击,但您将无法检测或防御 unknown 攻击。如果你的雇主坚持走这条路,你的尽职调查就是让管理层意识到这一事实并让他们以书面形式接受风险每有一次我向管理层提出这个问题时,他们选择了正确的解决方案——输出转义。

============================================= ===================

首先... watch out when using JSoup in any kind of a cleaning/filtering/input validation situation.

收到无效HTML,喜欢

<script>alert(1);

Jsoup 将添加缺失的 </script> 标签。

这意味着如果您将 Jsoup 用于 "cleanse" HTML,它会在开始处理之前首先将 INVALID HTML 转换为 VALID HTML。

So the question is: Is there some way through which I can make sure that my input is stripped of all HTML and javascript code at the filter? Should I throw in some regex validations but is there any regex that will take care of the cases that are getting past the check I have right now?

没有。 ESAPI 和 ESAPI 的输入验证不适合您的用例,因为 HTML is not a regular language 和 ESAPI 的验证输入是正则表达式。事实是你不能按你的要求做:

Is there some way through which I can make sure that my input is stripped of all HTML and javascript code at the filter?

并且还有一个正常运行的 Web 应用程序需要用户定义 HTML/JavaScript。

你可以把套牌堆得对你有利一点:我会选择像 OWASP's HTML Sanitizer. and test your implementation against the XSS inputs listed here 这样的东西。

其中许多输入来自 OWASP 的 XSS 过滤器规避作弊 sheet,并且至少会针对 已知 尝试对您的应用程序进行测试。但是如果没有输出转义,你永远不会安全。

===================根据评论更新==================

所以用例是尝试阻止 all html 和 javascript。我的建议是实现 caja,因为它封装了 HTML、CSS 和 Javascript。

Javascript 虽然也很难从输入验证中管理,因为像 HTML 一样,JavaScript 是一种非常规语言。此外,每个浏览器都有自己的实现,以不同的方式偏离 ECMAScript 规范。如果你想保护你的输入不被解释,这意味着你最好为每个试图解释用户输入的浏览器系列都有一个解析器来阻止它。

当您真正要做的就是确保对输出进行转义。抱歉打败了马,但我必须强调输出转义比拒绝用户输入重要 100 倍。你想要两者,但如果被迫选择一个或另一个,输出转义总体上工作较少。