Есть ли риск использовать $_SERVER['REQUEST_URI']
или $_SERVER['PHP_SELF']
как действие в форме или как href в ссылке?
Если да, то что можно сделать, чтобы облегчить риск?
Вы делаете форму на http://www.example.com/form.php. Через год вы забудете, что URL-адрес просто захватывает любой URL-адрес, на который загружается страница.
В какой-то момент предположим, вы добавили глобальную опцию «удалить все» в своей структуре как часть совершенно другого (слегка нечетного) запроса.
Теперь кто-то отправляет вам эту ссылку: http://www.example.com/form.php?delete_everything=true. Поскольку вы просто захватываете этот URL-адрес и устанавливаете его как действие, это теперь действие в вашей форме. К сожалению. Таким образом, атаки XSS работают в основном таким образом.
Всегда предполагайте, что ваш код будет использоваться (даже вами, и особенно хакерами) способами, которые вы не ожидаете, когда вы его впервые напишете.
Как вы обходите это? Hardcode URL! Вы можете включить функцию, которая возвращает URL-адрес. По сути, так решают такие решения, как Symfony или CodeIgniter.
$ _SERVER уязвим для атак XSS и должен быть очищен с использованием htmlspecialchars () перед использованием.
Пример инъекции:
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"></form>
Теперь вызовите форму со следующей инъекцией:
http://www.example.com/form.php/%22%3E%3Cscript%3Ealert ('xss attack')% 3C / script% 3E% 3Cbr% 20class =% 22relevant
Всегда помните, чтобы очищать входные данные … ВСЕГДА!
Это связано с тем, что $_SERVER['PHP_SELF']
и $_SERVER['REQUEST_URI']
можно манипулировать таким образом, чтобы , если вы не избегаете его должным образом , его можно использовать в атаках XSS.
Это стало возможным благодаря тому, что такой URL-адрес будет работать нормально:
/path/to/index.php/" onmouseover="alert('hi')
Давайте используем этот код:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>"> ... </form>
Он вызывает /path/to/index.php
, т. SCRIPT_NAME
, но когда вы просто повторяете $_SERVER['PHP_SELF']
он нарушит ваш предполагаемый HTML.
<form action="/path/to/index.php/" onmouseover="alert('hi')"> ... </form>
Решения
Во многих случаях использование <form action="">
достаточно, чтобы сделать сообщение формы самому скрипту. В противном случае, если вы знаете, что сценарий называется "bla.php"
, тогда установите action="bla.php"
.
Не забудьте преобразовать каждое вхождение «$ _SERVER ['PHP_SELF']" в "htmlentities ($ _ SERVER ['PHP_SELF']) на весь ваш скрипт.
Как избежать эксплойтов PHP_SELF http://www.html-form-guide.com/php-form/php-form-action-self.html
Нет, так как любой может изменить href
ссылки в любом случае (используя такой инструмент, как Firebug). Конечно, убедитесь, что вы не помещаете какие-либо конфиденциальные данные в эту ссылку.
Всегда проверяйте правильность проверки и анализа данных пользователя, которые вы получаете .