【问题标题】:How can I clean a HTML user input removing every possible script?如何清除 HTML 用户输入以删除所有可能的脚本?
【发布时间】:2014-04-21 08:50:24
【问题描述】:

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

编辑

我找到了一种名为 Jsoup 的消毒剂。它正是我需要的。但即使在放松模式下,它也会删除带有嵌入图像的 img 标签。

【问题讨论】:

    标签: java html xss


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的信息。我一直在阅读有关此处使用的 PageDown 的信息。但是“应该注意的是,就用户输入的输入而言,Markdown 是不安全的。Markdown 中几乎所有东西都是有效的,特别是像 这样的东西。这个 PageDown 存储库包括两个Stack Exchange 用来清理用户输入的插件;请参阅下面对 Markdown.Sanitizer.js 的描述”。我认为除了信任某些消毒工具之外,我们没有其他解决方案。
    • 我认为使用 Markdown + 完全删除 html 的消毒剂会更容易。除了从用户输入中删除(或尝试删除)HTML 之外,此清理程序还可以对给定的输入进行 htmlencode,然后应用降价规则来添加一些 html。这样,即使用户可以从删除阶段传递一些内容,也可以保证该 html 将在输出中编码。
    • 在我的情况下,我无法完全删除 HTML。该功能的全部意义在于让用户将 HTML 就绪的文章发送给其他用户。我想我可以使用 jsoup 清理脚本之类的东西,但我想保留嵌入的图像。
    • 我不是在坚持,请不要误会我的意思。我只想说清楚。使用 markdown 时,用户输入中不会出现 html 标签。这就是降价的工作方式。它有一些约定,例如当一个单词出现在两颗星 (*) 之间时,它应该呈现为粗体。所以通常,用户提供的降价数据不包括任何 html。 Sanitiser 此时可以删除整个 HTML。然后它对输入字符串进行 HTML 编码。然后将 markdown 约定转换为真正的 html 标签(例如将 * 转换为 )。
    • 据此:michelf.ca/blog/2010/markdown-and-xss 问题仍在清理 HTML
    【解决方案2】:

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

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

    它接受任何 src 内容以“data:”开头的 img。现在没关系,但我问了question 找到一种方法来接受 CKEditor 生成的内容“data:;base64”。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-28
      • 2020-06-21
      • 2020-06-12
      • 1970-01-01
      • 2017-09-12
      • 2018-07-02
      • 2013-06-21
      • 2023-04-09
      相关资源
      最近更新 更多