0

我正在<textarea></textarea>使用 PHP 中的 PDO 驱动程序将 html 从 a 保存到 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">

4

1 回答 1

1

我正在从<textarea></textarea>

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

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

htmlspecialchars()如果您想在 HTML 文档中显示提交的文本(即如果<strong>在文本区域中键入并且您希望呈现文本小于、强、大于并且没有强的开始标记,则使用正确的工具元素)。如果您想将提交的文本视为 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 sanitizer 列入白名单数据。

于 2013-04-10T10:31:19.317 回答