Перекрестная публикация этого как сводная ссылка от бета-версии документации SO, которая выходит в автономном режиме.
проблема
Межсайтовый скриптинг - это непреднамеренное выполнение удаленного кода веб-клиентом. Любое веб-приложение может представить себя XSS, если оно принимает данные от пользователя и выводит их непосредственно на веб-странице. Если ввод включает HTML или JavaScript, удаленный код может быть выполнен, когда этот контент отображается веб-клиентом.
Например, если сторонняя сторона содержит файл JavaScript:
// http://example.com/runme.js
document.write("I'm running");
И приложение PHP напрямую выводит строку, переданную в него:
<?php
echo '<div>' . $_GET['input'] . '</div>';
Если непроверенный параметр GET содержится, <script src="http://example.com/runme.js"></script>
то вывод сценария PHP будет:
<div><script src="http://example.com/runme.js"></script></div>
Будет запущен сторонний JavaScript, и пользователь увидит «Я бегу» на веб-странице.
Решение
Как правило, никогда не доверяйте данным, поступающим от клиента. Каждое значение GET, POST и cookie может быть чем угодно, и поэтому должно быть проверено. При выводе любого из этих значений избегайте их, чтобы они не оценивались неожиданным образом.
Имейте в виду, что даже в самых простых приложениях данные могут перемещаться, и будет сложно отслеживать все источники. Поэтому лучше всегда избегать вывода.
PHP предоставляет несколько способов избежать вывода в зависимости от контекста.
Функции фильтра
ПГПС Функции фильтрации позволяют входные данные в PHP скрипт , чтобы быть продезинфицировать или подтверждено в многих отношениях . Они полезны при сохранении или выводе клиентского ввода.
HTML кодировка
htmlspecialchars
преобразует любые «специальные символы HTML» в свои HTML-кодировки, то есть они не будут обрабатываться как стандартный HTML. Чтобы исправить наш предыдущий пример, используя этот метод:
<?php
echo '<div>' . htmlspecialchars($_GET['input']) . '</div>';
// or
echo '<div>' . filter_input(INPUT_GET, 'input', FILTER_SANITIZE_SPECIAL_CHARS) . '</div>';
Будет вывод:
<div><script src="http://example.com/runme.js"></script></div>
Все внутри <div>
тега не будет интерпретироваться браузером как тег JavaScript, а как простой текстовый узел. Пользователь безопасно увидит:
<script src="http://example.com/runme.js"></script>
Кодировка URL
При выводе динамически сгенерированного URL-адреса PHP предоставляет urlencode
функцию для безопасного вывода действительных URL-адресов. Так, например, если пользователь может вводить данные, которые становятся частью другого параметра GET:
<?php
$input = urlencode($_GET['input']);
// or
$input = filter_input(INPUT_GET, 'input', FILTER_SANITIZE_URL);
echo '<a href="http://example.com/page?input="' . $input . '">Link</a>';
Любой вредоносный ввод будет преобразован в закодированный параметр URL.
Использование специализированных внешних библиотек или списков OWASP AntiSamy
Иногда вам захочется отправить HTML или другой вид ввода кода. Вам нужно будет вести список разрешенных слов (белый список) и неавторизованных (черный список).
Вы можете скачать стандартные списки, доступные на веб-сайте OWASP AntiSamy . Каждый список подходит для определенного вида взаимодействия (ebay api, tinyMCE и т. Д.). И это с открытым исходным кодом.
Существуют библиотеки для фильтрации HTML и предотвращения XSS-атак в общем случае и выполнения по крайней мере так же, как списки AntiSamy с очень простым использованием. Например, у вас есть очиститель HTML