我应该使用 htmlspecialchars 吗?

Should I be using htmlspecialchars?

我似乎无法理解何时使用 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。

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

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

您可能会输出三种类型的数据(来自安全 POV)HTML:

  • 文字
  • 信任HTML
  • 不受信任HTML

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

如果是文字,则用htmlspecialchars转成HTML。

如果可信HTML,则直接输出

如果它不受信任 HTML 那么您需要对其进行清理以确保其安全。这通常意味着使用 DOM 解析器对其进行解析,然后删除所有未出现在白名单上的安全元素和属性(某些属性可能是特殊情况,需要过滤而不是去除),然后将 DOM 回到 HTML。 HTML Purifier 等工具可用于执行此操作。

$course->homepage = $_POST['homepage']; // may contain unsafe HTML

I would like that $course->homepage be treated and rendered as HTML by the browser.

那么你有第三种情况,需要过滤HTML。

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

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

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

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

你可能也值得看看 tinyMCE 看看他们是如何处理这些事情的