Предположим, что у нас есть эта форма, и возможная часть для пользователя, которая вводит вредоносный код, приведена ниже
... <input type=text name=username value= <?php echo htmlspecialchars($_POST['username']); ?>> ...
Мы не можем просто поместить тег или javascript: alert (); call, потому что значение будет интерпретироваться как строка, а htmlspecialchars отфильтровывает <,>, ', ", поэтому мы не можем закрыть значение с помощью котировок.
Мы можем использовать String.fromCode (…..), чтобы обойти кавычки, но я все еще не могу получить простое окно предупреждения.
Есть идеи?
Кроме того, важно упомянуть, что позволить людям вводить HTML или JavaScript на вашу страницу (а не ваш источник данных) не несет в себе собственного риска безопасности. Уже существуют расширения браузера, которые позволяют вам изменять DOM и скрипты на веб-страницах, но поскольку это только клиентская сторона, они будут единственными, кто будет знать.
Когда проблема XSS становится проблемой, когда люди используют ее для обхода проверки на стороне клиента или фильтрации входных данных или б) когда люди используют ее для управления полями ввода (например, изменение значений тегов OPTION в ACL для предоставления им разрешений не должно быть). Единственный способ предотвратить эти атаки – это санировать и проверять входные данные на стороне сервера, а не на валидации на стороне клиента.
Для дезинфекции HTML вне ввода htmlspecialchars вполне адекватна, если вы не хотите разрешать определенные теги, и в этом случае вы можете использовать библиотеку, такую как HTMLPurifier. Если вы вводите пользовательский ввод в HREF, ONCLICK или любой атрибут, который позволяет создавать скрипты, вы просто просите о проблемах.
EDIT: глядя на ваш код, похоже, вы не цитируете свои атрибуты! Это довольно глупо. Если кто-то поставил свое имя пользователя как:
john onclick="alert('hacking your megabits!1')"
Тогда ваш скрипт будет разбираться так:
<input type=text name=username value=john onclick="alert('hacking your megabits!1')">
ВСЕГДА используйте цитаты вокруг атрибутов. Даже если они не введены пользователем, это хорошая привычка.
<input type="text" name="username" value="<?php echo htmlspecialchars($_POST['username']); ?>">
Есть один путь. Вы не передаете htmlspecialchars () третий параметр кодирования или правильно проверяете кодировку, поэтому:
$source = '<script>alert("xss")</script>'; $source = mb_convert_encoding($source, 'UTF-7'); $source = htmlspecialchars($source); //defaults to ISO-8859-1 header('Content-Type: text/html;charset=UTF-7'); echo '<html><head>' . $source . '</head></html>';
Работает только в том случае, если вы можете: a) установить страницу для вывода UTF-7 или b) обмануть страницу для этого (например, iframe на странице без набора четких наборов символов). Решение состоит в том, чтобы гарантировать, что все входные данные имеют правильное кодирование и что ожидаемая кодировка правильно установлена на htmlspecialchars ().
Как это работает? В UTF-7 символы <> "имеют разные кодовые точки, чем UTF-8 / ISO / ASCII, поэтому они не экранируются, если не конвертировать вывод в UTF-8 для обеспечения (см. Расширение iconv).
value
является нормальным атрибутом HTML и не имеет ничего общего с Javascript.
Следовательно, String.fromCharCode
интерпретируется как буквальное значение и не выполняется.
Чтобы внедрить скрипт, сначала нужно заставить синтаксический анализатор закрыть атрибут, с которым будет трудно обойтись без >'"
.
Вы забыли поставить кавычки вокруг значения атрибута, поэтому все, что вам нужно, это пространство.
Даже если вы цитируете значение, оно может быть уязвимым; см. эту страницу .