Передача данных методом GET и POST в PHP


Передача данных методом GET и POST в PHP

Сейчас в сети интернет, очень редко можно встретить статичные Web-сайты написанные на чистом HTML. Для реализации более или менее серьезного проекта, необходимо использовать динамический движок написанный на PHP или Perl.

metods get post php

Любой относительно серьезный вебсайт, вынужден получать данные со стороны пользователя. Для передачи параметров со стороны пользователя, в PHP используется два метода: GET и POST. Рассмотрим пример передачи параметров методом GET, на примере авторизации для входа в админку.  Все параметры, которые получает скрипт помещаются в глобальные переменные и массив HTTP_GET_VARS, чаще всего используется короткое имя массива $_GET, опять же для удобства)

Основным преимуществом метода GET над POST является тот факт, что при самостоятельной разработке сайта с динамическим выводом контента страниц, в адресной строке браузера будет отображаться разные URL адреса. Например:

my_site.com/index.php?act=1
my_site.com/index.php?act=2
my_site.com/index.php?act=3 
и так далее..

Если же данные будут передаваться методом POST, то URL всех страниц будет выглядеть одинаково. Ну и соответственно поисковые системы просто не смогут разделить страницы сайта между собой, и дальнейшее поисковое продвижение закончится так и не начавшись. 😀

Передача параметров методом GET

Возвращаясь к скрипту авторизации на PHP приведу пример:

<form action="authorization.php" method="GET">
 <B>Authorization</B>
 <BR>User name: <input name="user">
 <BR>Password: <input type="password" name="pass">
 <P><input type="submit" value="Enter">
</form>
 
<?php
if (($user=="root") and ($pass=="kroot"))
{
$real=1;
}
 if ($real)
  {
   print("<HR>Закрытая страница. Привет $user !<HR>");
  }
?>

В данном примере мы создаем форму авторизации с двумя полями, а после поверяем, если $user==root и $pass==kroot то переменной $real присваиваем единицу, и дальше уже проверяем если переменная $real=1 то пользователь становится авторизован, и ему открывается закрытая информация!
Но возвращаясь к теме безопасности, данный скрипт написан криво. Ведь параметры передаваемые методом GET видны в строке URL, и ничто не мешает написать:

sites.com/authorization.php?real=1

И в результате, мы попадаем на закрытую страницу:)
В данном случае, уязвимость закрывается инициализацией переменной real в начале сценария:
$real=0;

Вот таким простым способом, можно защитить от взлома, закрытую область сайта, например панель администратора.
Если рассматривать этот метод на примере WordPress, то злоумышленник может легко сгенерировать код активации для сброса пароля администратора WordPress и найдя уязвимый плагин провести SQL инъекцию к таблице wp_users где и храниться этот код.
После этого ему нужно будет только добавить в адресную строку браузера Get запрос к скрипту wp-login.php:

sites.com/wp-login.php?action=rp&key=r35456s4rfw354weww&login=login

А дальше он сможет ввести новый пароль администратора WordPress и админка будет взломана.

XSS уязвимости в параметрах метода GET

Если внимательно посмотреть на скрипт авторизации, то можно обнаружить XSS уязвимость в переменной $user.

Внедрение XSS инъекции может выглядеть следующем образом:

sites.com/authorization.php?real=1&user=<script>alert(document.domain)</script>

В результате отправки данных, наш JavaScript будет выполнен. 😉

Использование метода POST 

Практически использование метода POST ни чем не отличается от GET, только за исключением того, что передаваемые параметры не видны в строке URL. Но не смотря на это ничто не помещает в строке браузера написать туже комбинацию с переменной real=1, как и при использовании метода GET, и вы будете успешно авторизованы, и перед вами откроются закрытые данные.

У метода POST для хранения данных используются, как глобальные переменные, так и массив $HTTP_POST_VARS. Ничто не помешает сохранить форму отправки данных на локальном компьютере, подделать переменные, и отправить параметры на сервер с localhost.

Для того, что-бы поменять метод передачи данных, вполне достаточно заменить в HTML форме method=GET на method=POST. И все будет отлично работать. В одной из следующих статей обязательно напишу, как можно взломать форму, данные в которой передаются через POST запрос, и способы защиты от сохранения формы.

Для поиска XSS уязвимостей в параметрах передаваемых методом POST, можно использовать плагин HackBar для Firefox.

XSS metods POST

Как видно из скриншота, уязвимые параметры вводятся в форму для отправки данных методом POST. Для активации формы необходимо поставить галочку в чекбокс Enable Post data.

P.S. В посте о том, как узнать количество нажатий на ссылку, я использовал метод GET для создания счетчика кликов по ссылке и даже во время написания сниффера который считывает данные cookie, во время тестирования всех доступных возможностей взлома страницы вконтакте, поэтому его применение можно считать достаточно широким в плане веб программирования. 😉