HTML字符正在按字面翻译

时间:2013-04-10 10:24:07

标签: php html mysql pdo doctype

我使用PHP中的PDO驱动程序将html从<textarea></textarea>保存到Mysql数据库。我尝试过使用htmlentities() & htmlspecialchars()。当从数据库请求html显示在DOM中时(分别使用html_entity_decode和&amp; htmlspecialchars_decode),它会逐字地返回标记。

所以,例如:

强文将以<strong>strong text</strong>

返回

我不完全确定它是否重要,但页面是用ANSI编码的,而我的doctype是

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

1 个答案:

答案 0 :(得分:1)

  

我正在从<textarea></textarea>

保存html

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

  

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

如果要在HTML文档中显示提交的文本(例如,如果在文本区域中键入htmlspecialchars()并且您要呈现文本,则

<strong>是正确使用的工具小于,强,大于并且没有强元素的开始标记)。如果要将提交的文本视为HTML,则不要使用这些功能。

  

当从数据库请求html显示在DOM中时(分别使用html_entity_decode和amp; htmlspecialchars_decode),它会逐字地返回标记。

这是你的问题。

你是:

  1. 采取一些文字
  2. 将其编码为HTML格式
  3. 将HTML插入数据库
  4. 将HTML从数据库中删除
  5. 将HTML解码为文本
  6. 将文本插入HTML文档,将其视为HTML
  7. 你应该做什么:

    1. 采取一些文字
    2. 将其插入数据库
    3. 将其从数据库中取出
    4. 将其编码为HTML
    5. 将HTML插入HTML文档
    6. 在步骤4使用htmlspecialchars,永远不要解码它(浏览器会这样做)。

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