【问题标题】:How to print out stored HTML from Database?如何从数据库中打印出存储的 HTML?
【发布时间】:2015-03-14 13:47:49
【问题描述】:

我在 HTML 表单中使用 HTML rich text editor,来自富文本编辑器的数据被插入到 MySQL 数据库表中的一个名为 first_page 的列中,该列的类型设置为“TEXT”。

所以如果在我的富文本编辑器中我有以下文本:

<h4 style="text-align: center;">Write your first page!</h4>

在插入数据之前,我会执行以下操作以确保数据免受任何 HTML 注入:

trim(stripslashes(htmlspecialchars($variable)));

然后当我提交表单时,数据库中的数据如下所示:

<h4 style="text-align: center;">Write your first page!</h4>

然后,当我编写查询并在单独的页面上打印列的值时,它不会解释 HTML,而是像普通字符串一样输出数据,如下所示:

不知道我哪里出错了,我想要的是将 HTML 实际打印为 HTML 而不是字符串。

已解决

正如@quentin 所建议的,我现在使用HTML Purifier 来防止XSS 之类的东西。我的问题的实际答案是使用 html_entity_decode 将我的 HTML 解码回适用的字符。

【问题讨论】:

  • 你能贴一些代码吗?
  • 您需要将HTML entities 转换回它们的标记,例如使用html_entity_decodephp.net/manual/en/function.html-entity-decode.php
  • @MarioWerner 太棒了,成功了。如果您可以将其写为答案,我会接受。
  • 嗯... 不要 htmlspecialchars你的HTML...!?当然,那么您就可以进行 HTML 注入了。不能两全其美。如果您想接受 HTML 而不接受 arbitrary HTML,则需要一个良好的选择性清理库。
  • htmlspecialchars 编码文本然后用html_entity_decode 将其转换回来是没有意义的。您应该删除 htmlspecialchars. 而不是添加 html_entity_decode

标签: php html wysiwyg rich-text-editor


【解决方案1】:

您为使您的网站免受 XSS 攻击而采取的方法是禁止用户将原始 HTML 输入数据库。

您不能同时禁止原始 HTML 并允许提交原始 HTML。

您需要用不同的机制替换对 htmlspecialchars 的调用以防止 XSS(例如通过 DOM 解析器运行输入,并将 filtering 的标签和属性设置为白名单)。

(您还应该将stripslashes(对SQL注入无效)替换为prepared statements and placeholders。)

【讨论】:

    【解决方案2】:

    您需要将 HTML 实体转换回它们的标记,例如使用 html_entity_decode。见http://php.net/manual/en/function.html-entity-decode.php

    但请记住,这是一个“快速而肮脏”的解决方案,例如使用 RegEx 解析 HTML。我建议听听昆汀在下面的答案中写了什么。 :)

    【讨论】:

      猜你喜欢
      • 2012-11-28
      • 1970-01-01
      • 2021-06-05
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      相关资源
      最近更新 更多