Как позволить Curl использовать тот же cookie, что и браузер из PHP

У меня есть php-скрипт, который выполняет HTTP-запрос от имени браузера и выводит ответ на браузер. Проблема в том, что когда я нажимаю ссылки из браузера на этой странице, он жалуется на переменные cookie. Я предполагаю, что ему нужны cookie(ы) браузеров для сайта.

Как я могу перехватить и направить его на удаленный сайт?

6 ответов


вы не можете.

Если вы свернете запрос, вам нужно будет проанализировать вывод и заменить все ссылки, чтобы они прошли через ваш сервер.

  www.yourdomain.com/f?=www.someotherdomain.com/realpage

единственный способ это будет работать, если вы используете куки в вашем запросе завиток. CURL может хранить куки самостоятельно. Назначьте идентификатор сеанса файлу cookie (в curl), чтобы последующие запросы получали те же файлы cookie. Когда пользователь нажимает ссылку, вам нужно будет снова свернуть запрос.

это проблема безопасности для разрешить site1 устанавливать cookies для site2. Представьте, что вы можете установить куки-файлы в браузере для paypal и обмануть пользователя, думая, что они вошли в систему int или какое-то другое вредоносное действие.


вот как я пересылаю все куки браузера в curl, а также возвращаю все куки для запроса curl обратно в браузер. Для этого мне нужно было решить некоторые проблемы, такие как получение cookies из curl, разбор HTTP-заголовка, отправка нескольких cookies и блокировка сеанса:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// get http header for cookies
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);

// forward current cookies to curl
$cookies = array();
foreach ($_COOKIE as $key => $value)
{
    if ($key != 'Array')
    {
        $cookies[] = $key . '=' . $value;
    }
}
curl_setopt( $ch, CURLOPT_COOKIE, implode(';', $cookies) );

// Stop session so curl can use the same session without conflicts
session_write_close();

$response = curl_exec($ch);
curl_close($ch);

// Session restart
session_start();

// Seperate header and body
list($header, $body) = explode("\r\n\r\n", $response, 2);

// extract cookies form curl and forward them to browser
preg_match_all('/^(Set-Cookie:\s*[^\n]*)$/mi', $header, $cookies);
foreach($cookies[0] AS $cookie)
{
     header($cookie, false);
}

echo $body;

в самом деле, это возможно. Вам просто нужно взять cookie браузера и передать его в качестве параметра для скручивания в mimik браузера. Это как сеанс домкрата...

вот пример кода:

// Init curl connection
$curl = curl_init('http://otherserver.com/');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// You can add your GET or POST param

// Retrieving session ID 
$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';    

// We pass the sessionid of the browser within the curl request
curl_setopt( $curl, CURLOPT_COOKIE, $strCookie ); 

// We receive the answer as if we were the browser
$curl_response = curl_exec($curl);

он работает очень хорошо, если ваша цель-вызвать другой веб-сайт, но это не удастся, если вы вызовете свой веб-сервер (тот же, который запускает команду curl). Это потому, что ваш файл сеанса по-прежнему открыт / заблокирован этим скриптом, поэтому URL-адрес, который вы вызываете, не может доступ к нему.

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

$curl = curl_init('http://sameserver.com/');
//...
session_write_close();
$curl_response = curl_exec($curl);

надеюсь, что это поможет кому-то :)


С curl_setopt:

по умолчанию libcurl всегда сохраняет и загружает все файлы cookie, независимо от того, являются ли они файлами cookie сеанса или нет.

однако вам может потребоваться установить cookies напрямую, что можно сделать с помощью:

curl_setopt($ch, CURLOPT_COOKIE, 'foo=bar');

который совпадает с HTTP-заголовком Set-Cookie. Проверьте, что вы не используете curl_setopt($ch, CURLOPT_COOKIESESSION, true) поскольку это заставит libcurl игнорировать некоторые куки.


Cookie обычно отправляется с заголовком HTTP-запроса, например

Host stackoverflow.com
User-Agent ...
Accept-Language en-us,en;q=0.5
Referer http://stackoverflow.com/unanswered
Cookie bla=blabla;blubb=blu

Так что я думаю, что просто нужно изменить файл cookie в заголовке.


ответ PiTheNumber был отличным, но я столкнулся с некоторыми проблемами, которые заставили его по-прежнему печатать заголовки на странице. Поэтому я отрегулировал его, чтобы использовать более надежный