href="css/<?php echo $style ?>.css"
Каждый раз, когда вы выводите текстовую строку в HTML, вы должны использовать htmlspecialchars()
в качестве значения, в противном случае символы вне диапазона, такие как <
, &
или в этом случае "
, будут ломатьсявне контекста (значения атрибута) и разрешить злоумышленнику вставить произвольный HTML-код на страницу, включая содержимое JavaScript.
Это в дыре для HTML-инъекции, и вы должны это исправить.Однако это еще не является уязвимостью XSS, поскольку источником $style
является $_COOKIE
.Этот cookie должен быть установлен вашими скриптами или самим пользователем;в отличие от значений $_GET
и $_POST
, он не может быть установлен в браузере пользователя третьей стороной.Это становится уязвимостью только в том случае, если вы позволяете третьей стороне устанавливать для файлов cookie пользователя произвольные значения.
Однако style-switcher.php
делает именно это:
$style = $_GET['style'];
setcookie("style", $style, time()+604800);
без проверкичтобы убедиться, что $style
является утвержденным значением, и нет проверки того, что запрос на переключение стилей был сделан самим пользователем, а не произвольной ссылкой на сторонний сайт: то есть он уязвим для XSRF.Скажем, злоумышленник включил ссылку или img src
на страницу, которую посетил пользователь, указывая:
http://www.example.com/style-switcher.php?style="><script>steal(document.cookie);</script>
, что сценарий теперь будет запускаться каждый раз, когда пользователь загружает страницу с вашего сайта.(Технически, символы "
, ;
и <
/ >
в этом примере необходимо кодировать URL-адресом с %
, но я оставил это здесь для удобства чтения.)
(Кроме того, вы действительно должны использовать форму POST для этого, так как она имеет побочный эффект.)
Что еще хуже, тот же скрипт содержит прямую эхо-инъекцию, которая определенно уязвима для XSS:
if(isset($_GET['js'])) {
echo $style;
}
Это отверстие позволяет вводить произвольное содержимое.Хотя обычно вы ожидаете, что этот скрипт с js
будет вызываться XMLHttpRequest
(через jQuery get()
), ничто не мешает злоумышленнику вызвать его, связав пользователя с URL-адресом, например:
http://www.example.com/style-switcher.php?style=<script>steal(document.cookie);</script>&js=on
и в ответ они получат эхо-ответ <script>
на странице, которая без явно установленного заголовка Content-Type
будет по умолчанию иметь значение text/html
, в результате чего на вашем сайте будет выполнен выбор JavaScript злоумышленника.контекст безопасности.
header("Location: ".$_SERVER['HTTP_REFERER']);
Это не очень хорошая идея по другим причинам.Заголовок Referer
не гарантированно попадет на ваш сервер.Чтобы убедиться, что это работает, передайте в сценарий URL-адрес для возврата в параметре.
Я, вероятно, не стал бы беспокоиться об этом со стороны PHP.Я бы просто установил соответствующий cookie из JavaScript и location.reload()
или изменил бы DOM таблицы стилей для обновления.Сценарий PHP - это попытка заставить коммутатор работать без JavaScript, но если вы не можете быть обеспокоены тем, как правильно и безопасно реализовать его с защитой XSRF, это является ответственностью.
Если вы включаете альтернативные таблицы стилей в виде <link rel="alternate stylesheet">
вы все равно будете предоставлять поддержку переключения таблиц стилей пользователям без JavaScript.