Тел.: +7 (495) 749 43 55

Полезные статьи

Статьи
ИНТЕРНЕТ ТЕХНОЛОГИИ
НОВОСТИ

СТАТЬИ




Передача формы методом POST в PHP двумя способами


Передача формы методом POST в PHP двумя способами

Некоторое время назад (можно даже сказать, что давно) передо мной встала задача сделать скрипт, который будет самостоятельно логиниться на один сайт через форму логина.

Форма выглядела примерно следующим образом:



  1. <form action="login.php" method="post">  
  2. <input name="name" value="" type="text" />  
  3. <input name="pwd" value="" type="password" />  
  4. <input value="Войти" type="submit" />  
  5. </form>  

Первым делом я конечно проверил, а можно ли передать логин и пароль скрипту login.php методом GET. Т.е. залогиниться с помощью примерно следующего URL:

http://somesite.com/login.php?name=test&pwd=test

При условии конечно, что на сайте зарегистрирован пользователь с логином test и аналогичным паролем.

Попробовал я, и у меня не вышло. Исходника login.php я не видел, но тут можно запросто предположить, что login.php принимает логин/пароль через переменную $_POST, а не $_REQUEST (как частенько бывает). Получается, что метод GET у нас отпадает.

И я начал искать решение. Получилось, что мне нужно как-то передать форму, но без кода HTML, т.е. из кода PHP. Нашел решение в библиотеке CURL, что идет вместе с PHP в качестве расширения. А потом узнал про то, что можно обойтись и без CURL, используя обыкновенные сокеты. Об этих двух способах передачи данных серверу через POST я и поведу речь далее.

Передаем POST-данные с помощью CURL

Напишем функцию, которая запостит то, что мы ей скажем, и вернет содержимое страницы в случае успеха или FALSE в случае возникновения какой-то ошибки.

  1. // $url     is string   
  2. // $post    is array   
  3. // $ssl     is boolean   
  4. // $headers is array   
  5. // $uagent  is string   
  6. //   example: $post = Array('name1' => 'value1', 'name2' => 'value2')   
  7. // returns:   
  8. // $result is string/boolean   
  9. function make_http_post_request($url$post$ssl = false, $headers = ''$uagent = '') {   
  10.     if (empty($url)) {   
  11.         return false;   
  12.     }   
  13.   
  14.     $_post = Array();   
  15.   
  16.     if (is_array($post)) {   
  17.         foreach ($post as $name => $value) {   
  18.             $_post[] = $name.'='.urlencode($value);   
  19.         }   
  20.     }   
  21.   
  22.     $ch = curl_init($url);   
  23.   
  24.     if ($ssl) { // если соединяемся с https   
  25.   
  26.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);   
  27.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);   
  28.   
  29.     }   
  30.   
  31.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   
  32.     curl_setopt($ch, CURLOPT_POST, 1);   
  33.     curl_setopt($ch, CURLOPT_HEADER, 0);   
  34.     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);   
  35.   
  36.     if (is_array($post)) {   
  37.         curl_setopt($ch, CURLOPT_POSTFIELDS, join('&'$_post));   
  38.     }   
  39.   
  40.     if (is_array($headers)) { // если заданы какие-то заголовки для браузера   
  41.         curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);   
  42.     }   
  43.   
  44.     if (!empty($uagent)) { // если задан UserAgent   
  45.         curl_setopt($ch, CURLOPT_USERAGENT, $uagent);   
  46.     }   
  47.   
  48.     $result = curl_exec($ch);   
  49.   
  50.     if (curl_errno($ch) != 0 && empty($result)) {   
  51.         $result = false;   
  52.     }   
  53.   
  54.     curl_close($ch);   
  55.   
  56.     return $result;   
  57. }  

И, естественно, приведу пример ее использования:

  1. $post = Array('login' => 'test''pwd' => 'test');   
  2. $headers   = Array();   
  3. $headers[] = "Content-type: application/x-www-form-urlencoded";   
  4.   
  5. $content = make_http_post_request('http://somesite.com/login.php'$post, false, $headers'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');   
  6.   
  7. if ($content !== false) {   
  8.     // анализируем контент   
  9. else {   
  10.     // какая-то ошибка   
  11. }  

Передаем POST-данные с помощью сокетов

Если на хостинге есть CURL, то это просто отлично. А если нет? Тогда придется писать вышеприведенную функцию с использованием сокетов. Правда ее декларация будет немного отличаться (для простоты), но суть та же - передать данные удаленному скрипту методом POST:

  1. function make_http_post_request($server$uri$post$uagent) {   
  2.     $_post = Array();   
  3.   
  4.     if (is_array($post)) {   
  5.         foreach ($post as $name => $value) {   
  6.             $_post[] = $name.'='.urlencode($value);   
  7.         }   
  8.     }   
  9.   
  10.     $post = implode('&'$_post);   
  11.   
  12.     $fp = fsockopen($server, 80);   
  13.   
  14.     if ($fp) {   
  15.         fputs($fp"POST /$uri HTTP/1.1\r\nHost: $server \r\n".   
  16.                 "User-Agent: $uagent \r\nContent-Type:".   
  17.                 " application/x-www-form-urlencoded\r\n".   
  18.                 "Content-Length: ".strlen($post)."\r\n".   
  19.                 "Connection: close\r\n\r\n$post");   
  20.         $content = '';   
  21.         while (!feof($fp)) {   
  22.             $content  .= fgets($fp);   
  23.         }   
  24.         fclose($fp);   
  25.   
  26.         return $content;   
  27.     }   
  28.   
  29.     return false;   
  30. }  

Как видите, здесь мы соединяемся с заданным сервером с помощью fsockopen и посылаем post-данные, склеенные амперсандом. Преимущество функции, работающей через сокеты, состоит в том, что сокеты поддерживаются практически везде, в отличие от CURL. Сделать вторую функцию такую же, как и первую (т.е. сделать такую же декларацию/прототип), Вы можете самостоятельно (я уверен в этом :) ).

Единственное, что я еще хотел сказать, но не сказал про логин из скрипта - это то, что в форме логина должна отсутсвовать капча, иначе - Вам прямая дорога к изучению ее взлома и проведению собственных исследований :)

Постовой:

  • Нужно охранять? Возьмите под видеонаблюдение свой объект. Системы от Пролайн.
  • Witel-300 Data: радиоудлинитель телефонной линии позволяет передавать данные без потери качества на расстояния до 100 километров.
  • Не обязательно сегодня должно быть 8 марта, чтобы подарить любимой женщине цветы. Вы можете заказать букет на сайте http://www.florio-fashion.com/

Популярность: 7%


WEBITEX
Rambler's Top100
Тел.: +7 (495) 749 43 55
E-mail: info@webitex.ru