如何清除删除每个可能脚本的HTML用户输入?

时间:2014-03-16 03:12:19

标签: java html xss

我正在使用CKEditor让用户输入富文本甚至嵌入的图像。该内容将发送给其他用户。如何防止像XSS这样的任何恶意注入?我想我只需要清除HTML,删除服务器端的所有可能的脚本,但我找不到任何经过测试的工具来做到这一点。即使GWT的SafeHTMLUtils也不会起作用,因为它会过多地修改HTML以破坏用户的预期输入。

修改

我找到了一种名为Jsoup的消毒剂。它完全符合我的需要。但即使在轻松模式下,它也会删除嵌入图像的img标签。

2 个答案:

答案 0 :(得分:2)

我设法用这种方式用Jsoup清理我的HTML输入:

Jsoup.clean(dirtyHTML, 
                Whitelist.relaxed()
                .addProtocols("img","src","data")
                .addAttributes(":all", "style")
                .addTags("span")));

它接受任何带有src内容的img,以" data:"开头。现在还可以,但是我要求question找到一种方法来接受CKEditor生成的内容" data :; base64"。

要向接收用户显示已清理的HTML数据,我们使用沙盒iframe来避免css灾难(例如覆盖整个页面的固定位置图像)。

<iframe sandbox="allow-same-origin">Sanitized HTML here inside body tag</iframe>

答案 1 :(得分:0)

很难以自动方式将好的HTML与坏的HTML分开。我不相信任何工具,即使他们声称是安全的。这种分离不仅限于检查使用哪些标签或属性,而是阻止某些类似脚本标签或事件处理程序属性(如img.onerror)。有许多技术可以从浏览器解析/处理HTML的方式中受益。每天都会引入新的漏洞利用方法。

我认为最安全的方法是使用Markdown编辑器,就像Stackoverflow上使用的那样。

您可以在此处找到一些参考资料:JQuery/JS Markdown plugin?