Почему мой код уязвим для атаки xss?

У меня php-код, как этот

<?php $input_from_user = "w' onclick = 'alert(document.cookie);'"; $i_am_barcelona_fan = htmlentities($input_from_user); ?> <input type = 'text' name = 'messi_fan' value ='<?php echo $i_am_barcelona_fan;?>' /> 

Я использую htmlentities для защиты от атаки XSS, но все же я уязвим для этой строки. Почему мой код уязвим для атаки XSS? Как я могу защитить от своего кода?

Вы также не говорите PHP, чтобы избежать кавычек, и вместо этого вы должны использовать htmlspecialchars() :

 <input type = 'text' name = 'messi_fan' value ='<?php echo htmlspecialchars($input_from_user, ENT_QUOTES, 'UTF-8'); ?>' /> 

демонстрация

Никогда (когда-либо) не доверяйте иностранным данным, введенным в ваш PHP-код. Всегда дезинфицируйте и проверяйте внешний ввод, прежде чем использовать его в коде. Функции filter_var и filter_input могут дезинфицировать текст и проверять текстовые форматы (например, адреса электронной почты).

Зарубежный ввод может быть любым: входные данные формы $ _GET и $ _POST, некоторые значения в супергелбале $ _SERVER и тело запроса HTTP через fopen ('php: // input', 'r'). Помните, что иностранный ввод не ограничивается формой данных, представленных пользователем. Загруженные и загруженные файлы, значения сеанса, данные cookie и данные сторонних веб-сервисов также являются иностранными.

Хотя зарубежные данные могут быть сохранены, объединены и доступны позже, это все еще иностранный ввод. Каждый раз, когда вы обрабатываете, выводите, объединяете или включаете данные в свой код, спрашивайте себя, правильно ли фильтруются данные и могут ли они быть доверенными.

Данные могут быть отфильтрованы по-разному в зависимости от цели. Например, когда нефильтрованный внешний вход передается в вывод HTML-страницы, он может выполнять HTML и JavaScript на вашем сайте! Это называется Cross-Site Scripting (XSS) и может быть очень опасной атакой. Один из способов избежать XSS – дезинформировать все пользовательские данные, прежде чем выводить их на вашу страницу, удалив теги HTML с помощью функции strip_tags или экранируя символы со специальным значением в их соответствующие объекты HTML с помощью функций htmlentities или htmlspecialchars.

Другим примером является передача параметров, которые будут выполняться в командной строке. Это может быть чрезвычайно опасно (и обычно это плохая идея), но вы можете использовать встроенную функцию escapeshellarg для дезинфекции аргументов исполняемой команды.

Последний пример – прием иностранного ввода для определения файла для загрузки из файловой системы. Это можно использовать, изменив имя файла на путь к файлу. Вам нужно удалить «/», «../», пустые байты или другие символы из пути к файлу, чтобы он не мог загружать скрытые, непубличные или чувствительные файлы.

Узнайте о фильтрации данных ( http://www.php.net/manual/en/book.filter.php )

Узнайте о filter_var ( http://php.net/manual/en/function.filter-var.php )