在WYSIWYG中纯化后呈现脚本标签

时间:2014-09-29 15:49:45

标签: laravel sanitization htmlpurifier

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

在sommernote中写一些内容,如:

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

帖子数据来自

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

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

以下是编辑器中处理内容的图像:

HTML Purifier Issue

以下是它如何存储在数据库中:

HTML Purifier Issue - 2

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

编辑:此外,如果我禁用Summernote WYSIWYG编辑器,则在使用HTMLPurifier进行清理时,会从textarea中成功删除标记。

1 个答案:

答案 0 :(得分:5)

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

当您将纯化的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应该按预期运行。 (如果它没有,爱德华实际上是对的 - 你应该看一个不同的编辑。)

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

正确转义文本后,然后即可进入WYSIWYG,获取文本并将其解释为HTML。

查看htmlspecialchars()是否修复了您的问题。它应该这样做,没有引起副作用,即使这对你来说可能看起来与直觉相反。

(当然,如果你已经按照描述使用htmlspecialchars(),那么我担心我不会有想法。)