我在使用HTMLPurifier php库时遇到问题。我正在为我的应用程序中的所有文本区域使用名为“Summernote”的WYSIWYG编辑器。
在sommernote中写一些内容,如:
<script>alert('test');</script>
帖子数据来自
<p><script>alert('test');</script></p>
但是,一旦通过HTMLPurifier运行,它就不会删除转换为常规字符的脚本标记。因此,当我在summernote中编辑此文本时,它实际上运行脚本!
以下是编辑器中处理内容的图像:
以下是它如何存储在数据库中:
如果有任何想法请告诉我!
编辑:此外,如果我禁用Summernote WYSIWYG编辑器,则在使用HTMLPurifier进行清理时,会从textarea中成功删除标记。
答案 0 :(得分:5)
我怀疑这里的根本问题是一个常见的错误:
当您将纯化的HTML输出到WYSIWYG时,您需要在其上使用htmlspecialchars()
。所以,不要在渲染页面的源代码中使用它......
<textarea ...>
<p><script>alert('test');</script></p>
</textarea>
......你需要这个:
<textarea ...>
<p>&lt;script&gt;alert('test');&lt;/script&gt;</p>
</textarea>
然后WYSIWYG应该按预期运行。 (如果它没有,爱德华实际上是对的 - 你应该看一个不同的编辑。)
正确的方法之所以是因为您希望在textarea中使用 text ,而不是HTML。如果您考虑没有HTML Purifier的方案,并且有人输入</textarea>
标记,后跟其他标记,则最容易实现。那些会突破<textarea>
,所见即所得。所以你把htmlspecialchars()
放在你输出的东西周围,这应该是textarea中的文本。它可以直接处理HTML标签是一个巧合 - 它相当误导,如果它不起作用可能会更好,但大多数浏览器仍然会显示HTML标签,就像它们一样如果你不这样做就被转义了。
正确转义文本后,然后即可进入WYSIWYG,获取文本并将其解释为HTML。
查看htmlspecialchars()
是否修复了您的问题。它应该这样做,没有引起副作用,即使这对你来说可能看起来与直觉相反。
(当然,如果你已经按照描述使用htmlspecialchars()
,那么我担心我不会有想法。)