我正在使用CKEditor让用户输入富文本甚至嵌入的图像。该内容将发送给其他用户。如何防止像XSS这样的任何恶意注入?我想我只需要清除HTML,删除服务器端的所有可能的脚本,但我找不到任何经过测试的工具来做到这一点。即使GWT的SafeHTMLUtils也不会起作用,因为它会过多地修改HTML以破坏用户的预期输入。
修改:
我找到了一种名为Jsoup的消毒剂。它完全符合我的需要。但即使在轻松模式下,它也会删除嵌入图像的img标签。
答案 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?