如何清理Java中的HTML代码以防止XSS攻击?
我正在寻找class/util等来清理HTML代码,即删除危险的标记、属性和值,以避免XSS和类似的攻击 我从富文本编辑器(例如TinyMCE)中获得html代码,但它可以通过恶意方式发送,不允许TinyMCE验证(“数据提交表单非现场”) 在PHP中有没有像InputFilter这样简单的东西?我能想象的完美解决方案是这样工作的(假设消毒剂封装在HtmlSanitizer类中):如何清理Java中的HTML代码以防止XSS攻击?,java,html,sanitization,xss,Java,Html,Sanitization,Xss,我正在寻找class/util等来清理HTML代码,即删除危险的标记、属性和值,以避免XSS和类似的攻击 我从富文本编辑器(例如TinyMCE)中获得html代码,但它可以通过恶意方式发送,不允许TinyMCE验证(“数据提交表单非现场”) 在PHP中有没有像InputFilter这样简单的东西?我能想象的完美解决方案是这样工作的(假设消毒剂封装在HtmlSanitizer类中): 字符串未初始化=“…”;//一些潜在的 //在这里输入危险的html HtmlSanitizer sat=新Htm
字符串未初始化=“…”;//一些潜在的
//在这里输入危险的html
HtmlSanitizer sat=新HtmlSanitizer();//已创建消毒器util类
字符串已清除=sat.sanitize(未清除);//瞧,消毒是安全的。。。
更新-解决方案越简单越好!对其他库/框架具有尽可能少的外部依赖性的小型util类对我来说是最好的
怎么样? 您可以使用,这是一个为执行此类操作而构建的安全库 它不仅有用于HTML的编码器,还有用于执行JavaScript、CSS和URL编码的编码器。可以在OWASP发布的XSS预防备忘单中找到。
您可以使用该项目定义一个站点策略,该策略声明用户提交的内容中允许的内容。站点策略稍后可用于获取显示在后面的“干净”HTML。您可以在上找到有关反配偶的示例。,您可能需要检查有关依赖关系的示例:
HTML转义输入非常有效。但在某些情况下,业务规则可能要求您不要逃避HTML。使用正则表达式不适合这项任务,使用它很难找到一个好的解决方案 我找到的最佳解决方案是使用: 它使用提供的输入构建DOM树,并过滤白名单先前不允许的任何元素。该API还具有其他清理html的功能 它还可以与javax.validation@SafeHtml(whitelistType=,additionalTags=)一起使用。您可以尝试。它使用起来非常简单
PolicyFactory policy = new HtmlPolicyBuilder()
.allowElements("a")
.allowUrlProtocols("https")
.allowAttributes("href").onElements("a")
.requireRelNofollowOnLinks()
.build();
String safeHTML = policy.sanitize(untrustedHTML);
多亏了@Saljack's。我只是想详细说明一下。这对我来说真的很好(很快)。我刚刚在Maven项目的pom.xml中添加了以下内容:
<dependency>
<groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
<artifactId>owasp-java-html-sanitizer</artifactId>
<version>20150501.1</version>
</dependency>
通过扩展allowElements方法中的逗号分隔参数,可以添加更多标记
在传递bean以保存数据之前,只需添加以下行:
bean.setHtml(sanitizeHTML(bean.getHtml()));
就这样
对于更复杂的逻辑,该库非常灵活,可以处理更复杂的清理实现。这需要重建整个项目的体系结构。我不愿意做这件事。我需要一些简单的东西,没有很多依赖项,也不需要改变我的代码的组织方式(我喜欢现在的方式)。所以-我只需要一个util类来完成这项工作。我的问题现在被更新以澄清这一需求。我不确定你所说的重建项目架构是什么意思。通过允许文本编辑器输入被输入到由site policy.Hmmm驱动的过滤库中,AntiSamy完全符合您的要求。看来你是对的!我只是认为它是一个大而重的框架,比如struts、spring等,可以作为某种servlet过滤器;-)。可能是名字中的大字(“OWASP”)误导了我。顺便说一句:OWASP AntiSamy的确切依赖关系是什么?我还需要使用什么?AntiSamy POM可能会给你一个提示(后面提供的链接来自SVN,不应该直接使用)。它确实需要一些其他的库,但我不确定AntiSamy如何在内部使用它们。参考:仅供参考,旨在提供一种更高效、更易于配置的反垃圾邮件替代方案。因此,您基本上希望客户能够提交表单,然后以fx的形式显示。留言簿?你希望他们能够使用html,但你仍然希望能够阻止恶意用户的黑客企图?还是我完全搞错了…?@Latze:我希望客户端(通过浏览器的用户)提交richtext内容(通过richtext editor-TinyMCE提交html格式),但检查并删除任何潜在危险(不安全)的内容。我不知道你在这里提到的外汇和留言簿是什么。啊!我来试试,给我几分钟
private String sanitizeHTML(String untrustedHTML){
PolicyFactory policy = new HtmlPolicyBuilder()
.allowAttributes("src").onElements("img")
.allowAttributes("href").onElements("a")
.allowStandardUrlProtocols()
.allowElements(
"a", "img"
).toFactory();
return policy.sanitize(untrustedHTML);
}
bean.setHtml(sanitizeHTML(bean.getHtml()));