Вопрос проверки подлинности PHP curl - PullRequest
1 голос
/ 29 сентября 2011

У меня есть собственный сайт, который хранит информацию для входа только в сеансе. Мне нужно использовать CURL для отправки формы, но уловка в том, что вам нужно сначала войти в систему, прежде чем вы сможете получить доступ к странице с формой. Поэтому я попытался создать два запроса, но, похоже, он не работает должным образом, хотя я получаю логин на странице входа в систему, а форма все еще показывает, что я вышел из системы.

//add data to be posted
$post_string1 = "username=test&password=1234";
$post_string2 = "value1=555";

//create cURL connection
$curl_connection1 = curl_init("http://".$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']), '/\\')."/login.php");
$curl_connection2 = curl_init("http://".$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']), '/\\')."/formpage.php");
 //create the multiple cURL handle
//set options
curl_setopt($curl_connection1, CURLOPT_POST, 1);
curl_setopt($curl_connection1, CURLOPT_POSTFIELDS, $post_string1);
curl_setopt ($curl_connection1, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($curl_connection1, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($curl_connection1, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection1, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection1, CURLOPT_FOLLOWLOCATION, 1);

curl_setopt($curl_connection2, CURLOPT_POST, 1);
curl_setopt($curl_connection2, CURLOPT_POSTFIELDS, $post_string2);
curl_setopt ($curl_connection2, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($curl_connection2, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($curl_connection2, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection2, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection2, CURLOPT_FOLLOWLOCATION, 1);


$mh = curl_multi_init();
curl_multi_add_handle($mh,$curl_connection1);
curl_multi_add_handle($mh,$curl_connection2); 

$active = null;

do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

//show information regarding the request
print_r(curl_getinfo($curl_connection1));
echo curl_errno($curl_connection1) . '-' . curl_error($curl_connection1);
//show information regarding the request
print_r(curl_getinfo($curl_connection2));
echo curl_errno($curl_connection2) . '-' . curl_error($curl_connection2);

Cookie.txt доступен для записи и содержит сессию, вот ответ:

Array
(
    [url] => http://mysite.com/login.php
    [content_type] => text/html; charset=UTF-8
    [http_code] => 200
    [header_size] => 762
    [request_size] => 404
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 1
    [total_time] => 0.270866
    [namelookup_time] => 2.9E-05
    [connect_time] => 0.000118
    [pretransfer_time] => 0.000193
    [size_upload] => 0
    [size_download] => 132955
    [speed_download] => 490851
    [speed_upload] => 0
    [download_content_length] => 0
    [upload_content_length] => 0
    [starttransfer_time] => 0.250872
    [redirect_time] => 0.01623
)
0-Array
(
    [url] => http://mysite.com/formpage.php?login=destroyed
    [content_type] => text/html; charset=UTF-8
    [http_code] => 200
    [header_size] => 786
    [request_size] => 415
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 1
    [total_time] => 0.056873
    [namelookup_time] => 2.6E-05
    [connect_time] => 9.9E-05
    [pretransfer_time] => 0.000198
    [size_upload] => 0
    [size_download] => 9790
    [speed_download] => 172137
    [speed_upload] => 0
    [download_content_length] => 1
    [upload_content_length] => 0
    [starttransfer_time] => 0.013818
    [redirect_time] => 0.042138

1 Ответ

1 голос
/ 29 сентября 2011

Не используйте две параллельные ручки для скручивания.В зависимости от условий сети, ваш ВТОРОЙ запрос curl может вначале достичь сервера, ДО запроса на вход в систему.

Кроме того, CURL считывает файлы cookie во время выполнения запроса.Оба ваших запроса сработают в основном в одно и то же время, ДО того, как файлы cookie для входа будут возвращены с сервера.Таким образом, оба запроса будут в состоянии «не вошли».

Используйте ОДИН дескриптор завитка и выполняйте каждый вызов в последовательности>

$ch = new CURL();
... set up login ...
... do login ...
... set options for second post
... do second post ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...