Перехресне повідомлення про це як консолідована посилання з бета-документації 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