Открыть меню    

PHP _SELF в атрибуте формы action

переменная php _self

В этой статье подробно говорится об использовании переменной 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/&quot;&gt;&lt;script&gt;alert('xss')&
lt;/script&gt;&lt;foo">

Как видите, часть скрипта чиста.

Итак, не забывайте преобразовывать $_SERVER['PHP_SELF'] в htmlentities($_SERVER['PHP_SELF']) на протяжении всего скрипта.

Стоит отметить, что некоторые серверы автоматически проводят эту конвертацию. К чему рисковать? Возьмите в привычку использовать PHP _SELF совместно с htmlentities().

Источник

Комментарии к статье