【问题标题】:HTML characters are being translated literallyHTML 字符被逐字翻译
【发布时间】:2013-04-10 10:24:07
【问题描述】:

我正在使用 PHP 中的 PDO 驱动程序将 html 从 <textarea></textarea> 保存到 Mysql 数据库。我试过使用htmlentities() & htmlspecialchars()。当从数据库请求 html 以在 DOM 中显示时(分别使用 html_entity_decode 和 htmlspecialchars_decode ),它按字面意思返回标签。

所以,例如:

强文本将返回为<strong>strong text</strong>

我不完全确定它是否重要,但页面是用 ANSI 编码的,我的文档类型是

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

【问题讨论】:

  • 输入是 HTML,输出是 HTML。为什么你需要任何转义?

标签: php html mysql pdo doctype


【解决方案1】:

我正在从 &lt;textarea&gt;&lt;/textarea&gt; 保存 html

请注意,就浏览器而言,它正在发送文本。它是否是 HTML 取决于您如何处理它。

我尝试过使用htmlentities() & htmlspecialchars()

htmlspecialchars() 是您想要在 HTML 文档中显示提交的文本时使用的正确工具(即,如果在文本区域中键入 &lt;strong&gt; 并且您想要呈现文本 小于,强, 大于 并且没有开始标签用于强元素)。如果您想将提交的文本视为 HTML,请不要使用这些函数。

当从数据库请求 html 以在 DOM 中显示时(分别使用 html_entity_decode 和 htmlspecialchars_decode),它按字面意思返回标签。

这是你的问题。

你是:

  1. 获取一些文本
  2. 对其进行编码以呈现为 HTML
  3. 将 HTML 插入数据库
  4. 从数据库中获取 HTML
  5. 将 HTML 解码为文本
  6. 将文本插入到将被视为 HTML 的 HTML 文档中

你应该做什么:

  1. 写一些文字
  2. 将其插入数据库
  3. 从数据库中取出
  4. 将其编码为 HTML
  5. 将 HTML 插入 HTML 文档

在第 4 步使用htmlspecialchars,永远不要解码(浏览器会这样做)。

如果您希望用户能够输入将呈现为 HTML 的 HTML,请跳过第 4 步。这将使您容易受到 XSS 攻击,因此除非您完全信任所有有权访问的人,否则请使用基于 DOM 的白名单数据上的 HTML 净化器。

【讨论】:

  • 谢谢,请注意。我切换到 html5,我编写了一个 clean_tag() 函数,无论如何它都包含一个白名单消毒剂。
猜你喜欢
  • 1970-01-01
  • 2020-01-20
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多