2009-07-13 7 views

risposta

2

Non è possibile.

Se si arriccia la richiesta, sarà necessario analizzare l'output e sostituire tutti i collegamenti in modo che vadano attraverso il server.

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

L'unico modo questo dovrebbe funzionare è se si utilizza cookie persistenti nella richiesta ricciolo. CURL può conservare i cookie stessi. Assegna un ID sessione al file cookie (in arricciatura) in modo che le richieste successive ottengano gli stessi cookie. Quando un utente fa clic su un link, è necessario arricciare nuovamente la richiesta.

È un problema di sicurezza per consentire a site1 di impostare i cookie per site2. Immagina di poter impostare cookie nel browser per paypal e indurre l'utente a pensare di aver effettuato l'accesso a int o qualche altra azione dannosa.

+0

Sembra che dovrei trovare una soluzione più standard come il reindirizzamento automatico o qualcosa del genere. Grazie –

0

il cookie viene di solito inviato con l'intestazione di richiesta HTTP come

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

Quindi credo che basta modificare la parte dei cookie nell'intestazione.

3

Da curl_setopt:

Per impostazione predefinita, libcurl sempre memorizza e carica tutti i cookie, indipendentemente se sono i cookie di sessione o meno.

Tuttavia potrebbe essere necessario impostare direttamente i cookie, che può essere fatto utilizzando:

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

Che è la stessa come intestazione HTTP Set-Cookie. Verifica che non stai usando curl_setopt($ch, CURLOPT_COOKIESESSION, true) poiché questo farà sì che libcurl ignori alcuni cookie.

+0

Ho scoperto di recente che "Per impostazione predefinita, libcurl memorizza sempre e carica tutti i cookie", il commento sembra essere falso a partire da PHP 5.3.8. Ho dovuto creare un cookie jar per curl per attraversare più di un reindirizzamento e non perdere i cookie per il dominio. –

5

In effetti, è possibile. Devi solo prendere il cookie del browser e passarlo come parametro per arricciare a mimik il browser. E 'come un sollevamento sessione di ...

Ecco un esempio di codice:

// 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); 

Funziona molto bene se il vostro scopo è quello di chiamare un altro sito web, ma questo non riuscirà se si chiama il vostro server web (lo stesso che sta lanciando il comando curl). È perché il tuo file di sessione è ancora aperto/bloccato da questo script, quindi l'URL che stai chiamando non può accedervi.

Se si desidera ignorare questa restrizione (chiamare una pagina sullo stesso server), è necessario chiudere il file sessione con questo codice prima di eseguire il ricciolo:

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

Spero che questo vi aiuterà qualcuno:)

+0

session_write_close(); funziona alla grande! Volevo dare migliaia di voti positivi! Ero pazzo di non capire perché il server non restituisce dati e nessun codice di risposta fino al timeout. Hai spiegato molto bene e funziona bene. – Tarik

10

In questo modo inoltro tutti i cookie del browser per arricciare e anche restituire tutti i cookie per la richiesta di ricciolo al browser.Per questo avevo bisogno di risolvere alcuni problemi come ottenere i cookie dal riccio, l'analisi di intestazione http, l'invio di più cookie e il blocco di sessione:

$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; 
+1

Potresti anche aggiungere: curl_setopt ($ ch, CURLOPT_USERAGENT, $ _SERVER ['HTTP_USER_AGENT']); –

0

risposta di PiTheNumber è stato grande, ma mi sono imbattuto in alcuni problemi con esso che ha provocato l'ancora di stampa le intestazioni alla pagina. Così l'ho regolato per usare la più affidabile funzione curl_getinfo. Questa versione segue anche i reindirizzamenti.

public function get_page_content($url) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    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)); 

    $destination = $url; 

    while ($destination) { 
     session_write_close(); 
     curl_setopt($ch, CURLOPT_URL, $destination); 
     $response = curl_exec($ch); 
     $curl_info = curl_getinfo($ch); 
     $destination = $curl_info["redirect_url"]; 
     session_start(); 
    } 
    curl_close($ch); 

    $headers = substr($response, 0, $curl_info["header_size"]); 
    $body = substr($response, $curl_info["header_size"]); 

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

    return $body; 
} 
Problemi correlati