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

从请求中过滤出编码的javascript内容,java,jsoup,xss,esapi,Java,Jsoup,Xss,Esapi,我有一个问题,我试图清理请求内容,去掉输入参数中包含的HTML和javascript 这基本上是为了防止XSS攻击,理想的机制是验证输入并对输出进行编码,但由于一些限制,我无法在输出端工作 此时我所能做的就是尝试通过过滤器清除输入。我使用ESAPI规范化输入参数,还使用jsoup和最严格的Whitelist.none()选项剥离所有HTML 只要恶意javascript位于某些HTML标记内,该方法就可以工作,但对于包含javascript代码且周围没有任何HTML的URL,该方法将失败,例如:

我有一个问题,我试图清理请求内容,去掉输入参数中包含的HTML和javascript

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

此时我所能做的就是尝试通过过滤器清除输入。我使用ESAPI规范化输入参数,还使用jsoup和最严格的Whitelist.none()选项剥离所有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());
因此,问题是:

  • 是否有某种方法可以确保我的输入在过滤器中去除所有HTML和javascript代码
  • 我是否应该加入一些regex验证,但是否有任何regex能够处理通过我目前检查的案例
免责声明:

如果在面向internet的解决方案中不允许输出转义,那么您将处于一种双赢的情况。这就像Windows上的防病毒软件:您可以检测特定的已知攻击,但无法检测或防御未知攻击。如果你的雇主坚持这条道路,你的尽职调查就是让管理层意识到这一事实,并让他们以书面形式接受风险。每次我与管理层面对这一问题时,他们都选择了正确的解决方案——输出逃逸

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

首先

收到无效的HTML时,如

警报(1)

Jsoup将添加缺少的
标记

这意味着,如果您使用Jsoup“清理”HTML,它首先将无效HTML转换为有效HTML,然后再开始处理

所以问题是:有没有什么方法可以确保 我的输入在最后一刻被去掉了所有的HTML和javascript代码 过滤器?我是否应该加入一些正则表达式验证,但是否有 regex将处理通过检查的案例 我现在有吗

否。ESAPI和ESAPI的输入验证不适合您的用例,因为ESAPI和ESAPI的输入验证是正则表达式。事实是你不能按你的要求去做:

有什么方法可以确保我的输入是正确的吗 在过滤器中删除所有HTML和javascript代码

并且仍然有一个功能正常的web应用程序,需要用户定义的HTML/JavaScript

您可以稍微堆叠一点对您有利的数据组:我会选择类似的内容,并根据列出的XSS输入测试您的实现

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

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

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

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


当你真正要做的就是确保输出被转义。很抱歉,我要说的是,输出转义比拒绝用户输入重要100倍。您想要两者,但如果被迫选择其中一个,则输出转义的工作量总体上会减少。

谢谢您的回复。我明白你的意思。如果我不想让用户传入任何HTML/JS作为请求输入参数,该怎么办。有什么办法可以防止吗?我将介绍您链接到这里的HTML消毒剂:基本上,您希望定义一个基本上为空的策略生成器。。。它不允许任何HTML标记进入应用程序。也就是说,仅仅拒绝所有html并不能阻止攻击html属性的XSS。。。如果IE你需要防范vbscript和javascript。我不知道如果你已经拒绝所有HTML输入,HTML清理程序是否允许你定义属性策略。我正在尝试拒绝所有HTML和JS输入,并使用一些HTML清理程序取得了一些成功。挑战在于,这些清洁剂依赖于HTML的输入来剥离它。但问题是某些输入可以被编码(为此我使用ESAPI.caninicalize将它们解码回最简单的形式)。但是如果一个输入没有任何HTML,并且有一些恶意的JS,比如我上面的问题中URL的'c'参数,那么我的代码逻辑就无法去除它们,因为JS不在任何类似HTML标记的标记中。什么样的方法可以很好地去除这样的输入?可以研究caja而不是HTML消毒剂。(Sanitizer是专门针对HTML的。)Caja设计用于处理CSS和用户输入的javascript。