2013-04-10 37 views
0

我使用PHP中的PDO驱动程序将html从<textarea></textarea>保存到Mysql数据库。我曾尝试使用htmlentities() & htmlspecialchars()。当从数据库中请求html显示在DOM中时(分别使用html_entity_decode & htmlspecialchars_decode),它会直接返回标签。HTML字符被字面翻译

因此,举例来说:

强大的文本将恢复为<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">

+0

输入是HTML,输出是HTML。为什么你需要逃避? – 2013-04-10 10:29:23

回答

1

我从一个<textarea></textarea>保存html

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

我一直在使用htmlentities() & htmlspecialchars()

htmlspecialchars()是正确的工具,如果你想,如果<strong>在文本区域输入显示HTML文档(即在提交的文本使用尝试和你想要呈现文字小于,强,大于,并且不具有用于强元素的开始标签)。如果您想将提交的文本视为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文档

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

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

+0

谢谢,正式注意。我切换到html5,我写了一个clean_tag()函数,无论如何它都包含了白名单清理工具。 – 2013-04-10 12:30:11