我应该使用htmlspecialchars吗?

时间:2016-04-28 12:14:46

标签: php html-escape-characters

我似乎无法理解何时使用htmlspecialchars()

我想在插入数据时执行以下操作:

$_POST = filter_input_array(INPUT_POST, [
    'name' => FILTER_SANITIZE_STRING,
    'homepage' => FILTER_DEFAULT // do nothing
]);

$course = new Course();
$course->name = trim($_POST['name']);
$course->homepage = $_POST['homepage']; // may contain unsafe HTML

$courseDAO = DAOFactory::getCourseDAO();
$courseDAO->addCourse($course);  // simple insert statement

当我输出时,我会执行以下操作:

$courseDAO = DAOFactory::getCourseDAO();
$course = $courseDAO->getCourseById($_GET['id']);
?>

<?php ob_start() ?>

<h1><?= $course->name ?></h1>
<div class="homepage"><?= $course->homepage ?></div>

<?php $content = ob_get_clean() ?>

<?php include 'layout.php' ?>

我希望浏览器将$course->homepage视为HTML并将其呈现为HTML。

我在这个问题上一直在阅读answers。我应该在这里的任何地方使用htmlspecialchars()吗?

3 个答案:

答案 0 :(得分:2)

(从安全POV)有三种类型的数据可以输出到HTML中:

  • 文本
  • 受信任的HTML
  • 不受信任的HTML

(请注意,HTML属性和某些元素是特殊情况,例如onclick属性需要HTML编码的JavaScript,因此您的数据必须是HTML安全 JS安全)。

如果是文字,请使用htmlspecialchars将其转换为HTML。

如果它是受信任的HTML,那么只需输出它。

如果它是不受信任的HTML,那么您需要对其进行清理以确保其安全。这通常意味着使用DOM解析器解析它,然后删除未出现在白名单中的所有元素和属性作为安全(某些属性可能是特殊的,可以过滤而不是剥离),然后将DOM转换回HTML。像HTML Purifier这样的工具可以做到这一点。

  

$ course-&gt; homepage = $ _POST ['homepage']; //可能包含不安全的HTML

     

我希望浏览器将$ course-&gt;主页视为HTML格式。

然后你有第三种情况需要过滤HTML。

答案 1 :(得分:1)

如果您确定内容,则输出纯HTML。在所有其他资源上使用htmlspecialchars,尤其是用户输入,以防止出现安全问题。

答案 2 :(得分:1)

看起来您将原始html存储在数据库中,然后再将其呈现给页面。

在将数据存储到数据库之前,我不会过滤数据,您可能会损坏用户输入,如果从未存储原始数据,则无法检索原始数据。

如果您希望浏览器将输出的数据视为html,那么htmlspecialchars不是解决方案。

然而,值得考虑使用striptags删除脚本标记以对抗XSS。使用striptags,您必须将允许的标签列入白名单,这显然是单调乏味但非常安全。

您可能还值得一看tinyMCE并了解他们如何处理此类问题