PHP _SELF в атрибуте формы action
В этой статье подробно говорится об использовании переменной PHP _SELF.
Что за переменная PHP _SELF?
Переменная PHP _SELF возвращает имя и путь к текущему файлу (относительно корня документа). Вы можете использовать эту переменную в атрибуте формы action. Существуют также некоторые нюансы, которые вы должны знать. Мы, конечно, никак не можем обойти стороной эти нюансы.
Давайте рассмотрим несколько примеров.
echo $_SERVER['PHP_SELF'];
1) Предположим, что ваш php файл расположен по следующему адресу:
http://www.yourserver.com/form-action.php
В этом случае переменная PHP _SELF будет содержать:
"/form-action.php"
2) Предположим, ваш php файл расположен по такому адресу:
http://www.yourserver.com/dir1/form-action.php
PHP _SELF будет:
"/dir1/form-action.php"
PHP _SELF в атрибуте формы action. Для чего она там понадобилась?
Обычно переменную PHP _SELF используют в атрибуте action
тега form
. В атрибуте action
указывается адрес, по которому будет отослано содержание формы после подтверждения (клик пользователем по кнопке с type="submit"). Как правило это таже самая страница, с которой ушла форма.
Однако, если вы переименуете файл, на который ссылается форма, вам понадобится переименовать название файла в атрибуте action
, иначе форма работать не будет.
Переменная PHP _SELF избавит вас от лишних исправлений, так как адрес страницы будет генерироваться автоматически, исходя из названия файла.
Допустим, у вас есть файл с формой form-action.php, и вы хотите, чтобы после подтверждения форма отправлялась на тот же самый файл. Обычно пишут так:
<form method="post"
action="form-action.php" >
Но вы можете использовать переменную PHP _SELF вместо form-action.php. В этом случае код будет выглядеть:
<form name="form1" method="post"
action="<?php echo $_SERVER['PHP_SELF']; ?>" >
Код для form-action.php
Объединим скрипт с формой:
<?php
if(isset($_POST['submit']))
{
$name = $_POST['name'];
echo "User name : <b> $name </b>";
echo "<br>Youcanusethefollowing form again to enter a new name.";
}
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="text" name="name"><br>
<input type="submit" name="submit" value="Submit Form"><br>
</form>
Код, стоящий в верхней части HTML страницы, будет выполнен первым. В первой строчке кода проверяется: форма отправлена или нет. Если существует $_POST['submit']
, то конструкция IF
выполняется (TRUE
) и будет выведено имя, введенное пользователем.
Если переменной $_POST['submit']
не существует, то форма не была отправлена и, соответственно, конструкция IF
выполняться не будет (FALSE
). Поэтому имя пользователя выведено не будет.
Нежелательные моменты, связанные с переменной PHP _SELF
Переменная PHP _SELF используется для того, чтобы получить имя и путь к текущему файлу - хорошо, но ее также могут использовать хакеры - плохо. Если на вашей странице стоит PHP _SELF, пользователь может ввести слеш (/
) и прописать вредоносные XXS скрипты.
Рассмотрим пример:
<form name="test"
action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Теперь, если пользователь зашел с нормального url
, то в адресной строке будет что-то наподобие:
http://www.yourdomain.com/form-action.php
а код, приведенный выше, можно прочитать так:
<form name="test" action="form-action.php" method="post">
В этом случае, как вы видите, все нормально.
Теперь давайте рассмотрим ситуацию, когда пользователь начинает "химичить" с адресной строкой:
http://www.yourdomain.com/form-action.php/%22%3E%3Cscript%3Ealert('xss')%3C
/script%3E%3Cfoo%22
В этом случае, после работы PHP ваш код примет такой вид:
<form name="test" method="post"
action="form-action.php"/>
<script>alert('xss')</script><foo"">
Вы можете видеть сами, что в код добавлен тег script
и команда alert
. Когда эта страница будет загружена, пользователь увидит окно с предупреждением. Это простой пример того, как можно эксплуатировать переменную PHP _SELF.
Любой JavaScript код может быть добавлен между тегами script
. Хакер также может ссылаться на JavaScript файл, который будет расположен на другом сервере. В этом файле, вероятно, будет вредоносный код, посредством которого хакер может изменить глобальные переменные и переправить форму на другой адрес с целью перехвата введенных пользователем данных.
Как избежать неприятностей, связанных с PHP _SELF
Неприятностей можно избежать, используя функцию htmlentities()
. Взгляните на код формы, где присутствует функция htmlentities()
.
<form name="test"
action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>"
method="post">
Функция htmlentities()
преобразует все возможные символы в соответствующие HTML-сущности. Теперь попытка обойти переменную PHP _SELF потерпит крах и результат внедрения вредоносного кода выразиться в следующем:
<form name="test" method="post"
action="form-action.php/"><script>alert('xss')&
lt;/script><foo">
Как видите, часть скрипта чиста.
Итак, не забывайте преобразовывать $_SERVER['PHP_SELF']
в htmlentities($_SERVER['PHP_SELF'])
на протяжении всего скрипта.
Стоит отметить, что некоторые серверы автоматически проводят эту конвертацию. К чему рисковать? Возьмите в привычку использовать PHP _SELF совместно с htmlentities()
.
Источник
Комментарии к статье