Our Blog

Уязвимость параметров при передаче данных методом POST

При передаче данных методом POST, казалось бы, проблема безопасности решается — данные не поподают в адресную строку, их нельзя подделать. Но проблема не решается полностью.. Проблему и ее решение читайте далее.

Рассмотрим, что это такая за уязвимость параметров при передаче данных методом POST.
Допустим, что Вы разрешили использовать глобальные переменные и применяете их для доступа к параметрам:

<form action="postparam.php" method="post">
User Name: <input name="UserName">
<input type="hidden" name="Password" value="qwerty">
</form>
<?php
if ($UserName<>""){
   print("<Р>Ваше имя пользователя: " );
   print("$UserName");
   print("<Р>Пароль: $Password");
}
?>

В этом примере из формы передаются параметры методом POST. Несмотря
на это, мы можем выполнить запрос следующего вида:
index.php?UserName=Flenov&Password=qwerty
То есть мы передаем параметры, как в методе GET, И при этом сценарий отработает верно. Почему? Проблема кроется в глобальных переменных, которые не «знают», какой метод мы используем, и не зависят от него. В этом отношении использование массивов $HTTP_POST_VARS И $HTTP_GET_VARS более безопасно, потому что они привязаны к методу. Если бы мы обрабатывали параметры с помощью массива $HTTP_POST_VARS, то попытка передать параметры методом GET завершилась бы неудачей, потому что такие параметры попадают в другой массив $HTTP_GET_VARS.
Вот, как можно получить доступ к параметрам через массивы, а также запретить передачу параметров через строку URL, т. е. методом GET. Если массив $HTTP_GET_VARS не пустой, то выполнение цикла прерывается с сообщением о неверном параметре:

<form action="arrayparam.php" method="post">
User Name: <input name="UserName">
<input type="hidden" name="Password" value="qwerty">
</form>
<?php
if (count($HTTP_GET_VARS)>0) {
   die("Неверный параметр");
}
if ($HTTP_POST_VARS["UserName"]<>""){
   print("<Р>Ваше имя пользователя: " );
   print($HTTP_POST_VARS["UserName"]);
   print("<Р>Ваш пароль: " );
   print($HTTP_POST_VARS["Password"]);
}
?>
Comments ( 0 )
    -->