Сегодня хотел бы рассказать про одну брешь в безопасности, которая довольно часто встречается с исходных кодах многих проектов. Это перевод в моей вольной интерпретации и с комментариями статьи Mark Jaquith. Статья написана главным образом для разработчиков плагинов к WordPress, но может быть полезна и для остальных разработчиков на PHP. Речь пойдет про опасность использования переменных $_SERVER['PHP_SELF'] и $_SERVER['REQUEST_URI']. Самый простой пример их использования – атрибут action в формах:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>">
Впрочем, часто переменную используют и в ссылках:
<a href="<?php echo $_SERVER['PHP_SELF']' ?>?id=2">link</a>
Марк пишет, что использовать такого рода конструкции небезопасно и ведет к возможности выполнение XSS (cross-site scripting) атаки.
Далее предлагаются такие варианты выхода из ситуации: в случае с формой можно оставить атрибут action просто пустым. По умолчанию, скрипт будет ссылаться сам на себя.
<form action="">
Если же переменная $_SERVER используется в качестве ссылки,то следует пропустить ее через функцию esc_url() (справедливо для WordPress) или жестко зафиксировать адрес скрипта в другой переменной (это уже для всех разработчиков PHP)
<a href="<?php echo esc_url( $_SERVER['PHP_SELF'] . '?id=1' ); ?>">link</a>
или
$script_path = "link"l <a href="<?php echo esc_url( $script_path . '?id=1' ); ?>">link</a>
Таким образом вы обезопаситесь от XSS атак. Каких? А, например, вот таких: имеем скрипт с параметром $_SERVER['PHP_SELF'] в теге action далее переходим по адресу script.php/”%20onmouseclick=’alert(document.cookie)’ и смотрим результат. Думаю пояснять, что будет в результате не нужно. Пример так же работает и с одинарными кавычками. Кроме того, использование функции htmlentities() в качестве фильтра http заголовка не поможет!
Вывод:
1) Оставляем пустым значение атрибута action в формах
2) По возможности не используем переменные $_SERVER['PHP_SELF'] и $_SERVER['REQUEST_URI']
3) Если используем, то прогоняем через функцию esc_url()
Легкого и безопасного вам программирования!







