我应该使用 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 看看他们是如何处理这些事情的
我似乎无法理解何时使用 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 看看他们是如何处理这些事情的