Должен ли я использовать 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 браузером.

Я читаю ответы по этому вопросу. Должен ли я использовать htmlspecialchars() где-нибудь здесь?

1

Решение

Существует (из POV безопасности) три типа данных, которые вы можете выводить в HTML:

  • Текст
  • Доверенный HTML
  • Ненадежный HTML

(Обратите внимание, что атрибуты HTML и некоторые элементы являются особыми случаями, например, атрибуты onclick предполагают JavaScript в кодировке HTML, поэтому ваши данные должны быть безопасными для HTML а также JS безопасно).

Если это текст, то используйте htmlspecialchars преобразовать его в HTML.

Если это доверенный HTML, просто выведите его.

Если это ненадежный HTML, то вам нужно санировать его, чтобы сделать его безопасным. Как правило, это означает, что он анализируется с помощью синтаксического анализатора DOM, а затем удаляются все элементы и атрибуты, которые не отображаются в белом списке, как безопасные (некоторые атрибуты могут быть специальными, если их фильтруют, а не удаляют), а затем преобразуют DOM обратно в HTML. Для этого существуют такие инструменты, как HTML Purifier.

$ course-> homepage = $ _POST [‘homepage’]; // может содержать небезопасный HTML

Я бы хотел, чтобы эта страница $ course-> homepage обрабатывалась и отображалась браузером как HTML.

Тогда у вас третий случай и вам нужно отфильтровать HTML.

2

Другие решения

выведите обычный HTML, если вы уверены в его содержании. используйте htmlspecialchars на любых других ресурсах, особенно для пользовательских входных данных, чтобы предотвратить проблемы безопасности.

1

Похоже, что вы храните необработанный HTML в базе данных, а затем выводите его на страницу позже.

Я не отфильтрую данные до того, как вы сохраните их в БД, вы рискуете испортить ввод данных пользователем, и не будет никакого способа получить оригинал, если он никогда не будет сохранен.

Если вы хотите, чтобы выведенные данные обрабатывались браузером как html, то нет, htmlspecialchars это не решение.

Однако стоит подумать об использовании striptags удалить теги сценария для борьбы с XSS. С striptags Вы должны внести в белый список допустимые теги, что очевидно утомительно, но довольно безопасно.

Возможно, стоит взглянуть на TinyMCE и посмотрим, как они справляются с такими вещами

1
По вопросам рекламы [email protected]