asd asdsa f
Разное

Безопасное использование PHP_SELF

Эта переменная возвращает имя и путь к файлу, из которого выполняется. Она используется в качестве значения для атрибута action в формах. например:

<form method="post" action="<?php echo $_SERVER[‘PHP_SELF’]; ?>">
<input type="text" name="name"><br>
<input type="submit" name="submit" value="Submit Form">
</form>

Если путь к файлу http://www.yourserver.com/form-action.php, то переменная PHP_SELF должна иметь значение form-action.php. Если путь, например, http://www.yourserver.com/dir1/form-action.php, то переменная PHP_SELF должна иметь значение /dir1/form-action.php.

Скажем мы имеем такой код:

<?php
if(isset($_POST[‘submit’]))
{
$name = $_POST[‘name’];
echo "User Has submitted the form and entered this name : <b> $name </b>";
echo "<br>You can use the following 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>

А путь к этому файлу http://www.yourserver.com/form-action.php. То можно с этим адресом добавить следующий код:

/%22%3E%3Cscript%3Ealert(‘xss’)%3C
/script%3E%3Cfoo%22

То есть полный адрес должна быть такой:

http://www.yourdomain.com/form-action.php/%22%3E%3Cscript%3Ealert(‘xss’)%3C
/script%3E%3Cfoo%22

То есть браузеру передастся такой код:

<form name="test" method="post" action="form-action.php"/>
<script>alert(‘xss’)</script><foo"">

А этот код приведет к тому, что браузер выбросит окно предупреждения со словом xss. Но это лишь небольшой пример. Настоящая неприятность в том, что вот так используя JavaScrip можно инициировать значительно вреднее сценарий, а именно: установить ссылку на файл, лежащий на другом сервере, а то файл в свою очередь может содержать вредоносный код, который изменяет, скажем, значение глобальных переменных или отправить значение, которые передаются через форму на другой адрес, перехватывая указанные в форме данные.

Интересно то, что эта проблема решается просто с помощью использования функции htmlentities (). То есть мы ее имеем применить к:

$_SERVER[‘PHP_SELF’]

Тобто увесь код має у цьому випадку виглядати так:

<?php
if(isset($_POST[‘submit’]))
{
$name = $_POST[‘name’];
echo "User Has submitted the form and entered this name : <b> $name </b>";
echo "<br>You can use the following form again to enter a new name.";
}
?>
<form method="post" action="<?php echo htmlentities($_SERVER[‘PHP_SELF’]); ?>">
<input type="text" name="name"><br>
<input type="submit" name="submit" value="Submit Form"><br>
</form>

Теперь если будет использован следующий код:

http://www.yourdomain.com/form-action.php/%22%3E%3Cscript%3Ealert(‘xss’)%3C
/script%3E%3Cfoo%22

У нашего хакера ничего не получится, потому что на выходе он получит:

<form name="test" method="post"
action="form-action.php/&quot;&gt;&lt;script&gt;alert(‘xss’)&
lt;/script&gt;&lt;foo">

Хотя на некоторых серверах такая конвертация для безопасности работает автоматически, но лучше не рисковать и с PHP_SELF всегда использовать htmlentities().

About the author / 

Adam