【问题标题】:Script tags being rendered after purification in WYSIWYG在 WYSIWYG 中纯化后呈现的脚本标签
【发布时间】:2014-11-24 01:56:10
【问题描述】:

我在使用 HTMLPurifier php 库时遇到问题。我正在为我的应用程序上的所有文本区域使用名为“Summernote”的所见即所得编辑器。

在sommernote中写一些东西时:

<script>alert('test');</script>

帖子数据来自

<p><script>alert('test');</script></p>

但是,一旦通过 HTMLPurifier 运行,它不会删除转换为常规字符的脚本标签。所以当我在summernote中编辑这段文字时,它实际上会运行脚本!

这是编辑器处理的图像:

这是它在数据库中的存储方式:

如果有人有任何想法,请告诉我!

编辑:另外,如果我禁用 Summernote 所见即所得编辑器,则在使用 HTMLPurifier 清理时,标签会成功从文本区域中删除。

【问题讨论】:

    标签: laravel sanitization htmlpurifier


    【解决方案1】:

    我怀疑这里的根本问题是一个常见的错误:

    当您将纯化后的 HTML 输出到 WYSIWYG 中时,您需要在其上使用htmlspecialchars()。所以,不要在渲染页面的源代码中使用它...

    <textarea ...>
      <p>&lt;script&gt;alert('test');&lt;/script&gt;</p>
    </textarea>
    

    ...你需要这个:

    <textarea ...>
      &lt;p&gt;&amp;lt;script&amp;gt;alert('test');&amp;lt;/script&amp;gt;&lt;/p&gt;
    </textarea>
    

    那么 WYSIWYG 应该会按预期运行。 (如果不是,Edward 实际上是对的 - 你应该看看其他编辑器。)

    这样做的正确方法是因为您希望 text 在您的文本区域中,而不是 HTML。如果您考虑没有 HTML Purifier 的场景,并且有人输入 &lt;/textarea&gt; 标记,然后是其他标记,则最容易实现这一点。那些将打破&lt;textarea&gt;,所见即所得。所以你在你输出的东西周围放了一个htmlspecialchars(),它应该是文本区域中的文本。它可以直接处理 HTML 标签的事实是一个巧合 - 它相当具有误导性,如果它不起作用可能会更好,但大多数浏览器仍然会显示 HTML 标签,好像它们 被转义了如果你不这样做。

    一旦文本被正确转义,然后 WYSIWYG 可以进来,获取文本并将其解释为 HTML。

    查看htmlspecialchars() 是否解决了您的问题。它应该这样做,不会造成副作用,即使现在这对你来说似乎违反直觉。

    (当然,如果你已经按照描述使用了htmlspecialchars(),那么我恐怕没有一个即兴的想法。)

    【讨论】:

    • 这就是问题所在(在输出到编辑器时使用htmlspecialchars()),我完全忘记了这个功能。非常感谢!
    • 甜蜜。很高兴你修好了它! :)
    猜你喜欢
    • 2016-03-27
    • 2014-02-17
    • 1970-01-01
    • 2013-04-13
    • 2020-09-24
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多