htmlentities和htmlspecialchars停止显示文本

时间:2014-01-21 21:03:16

标签: php sanitization htmlspecialchars strip-tags

我正在尝试在我的网站上的评论框表单中显示评论。我最初使用以下方式显示它:

<?php while($comment_text = mysqli_fetch_assoc($display_comments)) { ?>
<div class="comment" style="margin-bottom: 2em;">
    <div class="author">
      <b><?php echo htmlentities($comment_text["author"]); ?></b>
    <span class="datetime">
      <i><?php echo datetime_to_text($comment_text["created"]); ?></i>
    </span>
    </div>
  <div class="body">
        <?php echo strip_tags($comment_text["body"], '<strong><em><p>'); ?>
  </div>
</div>
<?php } ?> 

当显示“body”文本时,我使用“strip_tags”。但是,我听说我应该使用htmlentities或htmlspecialchars,因为它更安全,但每当我尝试用其中一个替换“strip_tags”时,注释就不会显示。它只是显示评论的作者,然后在它下面没有任何内容。

表单工作正常,每当我发布到我的数据库时,我都会使用“mysqli_real_escape_string”。我看到数据库中的注释,当我使用htmlentities或htmlspecialchars时它们就不会显示。

我是php的新手,我想确保我的表格安全。任何帮助将不胜感激!

更新:我尝试过显示不同的测试评论。当我使用htmlspecialchars时,什么都不会出现,即使它像“test”这样简单

1 个答案:

答案 0 :(得分:1)

您必须选择要使用的内容:要么允许使用某些html标记,要么使用htmlspecialchars,要么使用htmlspecialchars并且不允许使用任何html。

请注意,第一个选项存在xss风险,因此如果内容不受信任,则不应使用它。

问题在于,当您使用htmlspecialchars时,所有特殊字符都会被编码,因此您不会看到一些粗体文本,而是会在浏览器中看到围绕渲染文本的粗体开始和结束标记。