【问题标题】:PHP htmlspecialchars() function shows html safe tags in pagePHP htmlspecialchars() 函数在页面中显示 html 安全标签
【发布时间】:2014-08-12 11:52:29
【问题描述】:

我有一个表格,用户填写并发送他们的问题,然后管理员将回答他们,最后这些问题将显示在网站上。
为了防止攻击,我使用了 PDOhtmlspecialchars() 函数。我不对输入数据应用任何更改,只使用 PDO 存储它们。但是当我想在页面中显示它们时,我使用 htmlspecialchars()。但这导致即使<p> 标记也作为文本的一部分出现在文本中。有什么问题,我该如何解决?

存储问题:

$stmt = "INSERT INTO tbl_questions (title,question) VALUES (?,?)";  
$q = $db->prepare($stmt);
$q->execute(array($_POST['title'],$_POST['question']));

显示问题:

echo htmlspecialchars($title).'<br />'.htmlspecialchars($question);

【问题讨论】:

  • 为什么用htmlspecialchars来显示记录?它们不应该以其他方式显示吗?
  • 防止XSS攻击
  • 那么你应该在数据库中存储问题时使用htmlspecialchars,在echo处理问题时使用htmlspecialchars_decode
  • 你可以使用strip_tags();

标签: php html tags xss htmlspecialchars


【解决方案1】:

htmlspecialchars 的方法并不完美。

看看htmlpurifier。通过白名单过滤器更强大。有了它,你的用户就可以写html了(比如&lt;p&gt;),你就不会有XSS的风险了。

考虑一下,在将其存储到数据库之前使用它,这样您就不需要在每个页面视图上都对您的输入进行消毒。

【讨论】:

  • strip_tags($title, '&lt;p&gt;'); 不会删除&lt;p&gt; 标签!!!这是为了允许标签!
  • @ShaunakShukla 我的错。删除了这部分。
  • @ChristianGollhardt 您建议的解决方案非常好。但是为什么 htmlspecialchars() 没有将

    转换为安全字符?

  • @MohammadSaberi 方法是保存(&amp;lt;&amp;gt; 转义为 &amp;lt;&amp;gt;)。但问题是,正如您在问题中所描述的那样,&lt;p&gt; 将被显示并且不会被格式化为段落。从技术上讲,该函数将所有“特殊 html 字符”替换为显示代码。
【解决方案2】:

如果您只想显示文本,甚至控制哪些标签被转换/删除,您可以选择使用strip_tags

echo strip_tags($title, '<p>');

将显示您的标题而不显示您的p 标签。

编辑:还要意识到,即使通过允许标签,您也允许某些属性正常运行,这不会让您免受 XSS 攻击。

<p onclick="alert('xss scripting')">Awesome</p>

这仍然有效,因此建议使用过滤库,例如 HTML Purifier

【讨论】:

  • 第二个参数其实是allowable_tags,所以如果是'&lt;p&gt;',那么会显示ps。
  • 这是有意的。我知道他们不会被“删除”我只是说他们不会因为htmlspecialchars而向观众显示&amp;lt;p&amp;gt;
【解决方案3】:

这不是问题,只是您没有为您的任务选择正确的功能。
htmlspecialchars() 不会删除标签,它只是将它们转换为显示而不是被执行。因此,例如,&amp;lt;p&amp;gt; 变为 &amp;lt;p&amp;gt;
如果您想(部分)删除标签,请使用strip_tags() 函数。而且,如果您不需要这些标签,您可以(而且我认为应该)在将内容添加到数据库之前将它们剥离。
此外,您可以允许某些标签,例如:

$q->execute(array(strip_tags($_POST['title']), strip_tags($_POST['question'], "<br><em>"));

这样你就可以在你的问题中允许&lt;br&gt;&lt;em&gt;。这不是必需的,我只是向您展示该功能的可能性。

但是,如果您想使用更灵活的规则,我建议您使用 HTML sanitizer。例如,我使用HTMLawed。它不仅允许指定允许的标签,还允许指定包括通配符在内的允许的属性和类(例如,您可以删除除class 属性之外的任何内容,或允许除style 属性之外的所有内容)。

【讨论】:

  • 虽然我用过 htmlspecialchars(),但它不会将 转换为它们的 <p>。当我看到页面的来源时,我可以看到 &amp;lt;p&amp;gt; 准确
  • 编辑了答案,添加了关于我使用的 HTML sanitizer 的注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
相关资源
最近更新 更多