PHP + Cookies + libCurl

Já se perguntou como você seria capaz de usar cookies junto com libCurl? Vou demonstrar como fazer isso fornecendo um exemplo de um site que exige login para permitir o acesso às suas páginas.

Em primeiro lugar, precisamos de um arquivo temporário para armazenar os cookies.

$tmpfile = tempnam (sys_get_temp_dir(), "CURLCOOKIE");

Então, precisamos dizer ao curl que queremos armazenar os cookies naquele arquivo.

curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfile);

Para citar PHP.net: (para CURLOPT COOKIEJAR)
“O nome de um arquivo para salvar todos os cookies internos quando o identificador for fechado, por exemplo, após uma chamada para curl
close.”

Depois de executar isso (junto com o resto do código curl), você terá cookies salvos no seu sistema. No entanto, precisamos armazenar $ tmpfile em algum lugar. Vamos armazenar parte dele em um cookie para que possamos encontrar o arquivo posteriormente em nosso sistema.

setcookie("tmpfile", basename(str_replace("CURLCOOKIE", '', $tmpfile)), time()+7200);

Aqui está o log remoto em código curl: (este é um exemplo, as opções podem variar dependendo do que você deseja alcançar)

$tmpfile = tempnam (sys_get_temp_dir(), "CURLCOOKIE");

// store tmpfile in cookies (TESTING PURPOSES ONLY)
setcookie
("tmpfile", basename(str_replace("CURLCOOKIE", '', $tmpfile)), time()+7200);

$curl_result
= $curl_err = '';
$req
= 'email='.$email.'&password='.$password;
$ch
= curl_init();
curl_setopt
($ch, CURLOPT_URL, "http://yourtestwebiste.com/login.php");
curl_setopt
($ch, CURLOPT_COOKIEJAR, $tmpfile); // if logged in properly, login.php will tell the system which cookies to save and curl will save them in the temporary file $tmpfile
curl_setopt
($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt
($ch, CURLOPT_POST, 1);
curl_setopt
($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt
($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req)));
curl_setopt
($ch, CURLOPT_HEADER , 0);
curl_setopt
($ch, CURLOPT_VERBOSE, 0);
curl_setopt
($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt
($ch, CURLOPT_TIMEOUT, 30);

$curl_result
= @curl_exec($ch);
$curl_err
= curl_error($ch);
curl_close
($ch);

if ($curl_result === false)
die("Error");
else {
// Do something
}

Então, se quiser usar o curl para acessar outra página nesse site, você deve usar:

curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfile); 

em vez de: (e alterar o resto das chamadas curl para algo que se adapte às suas necessidades)

curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfile);

e, neste caso, $ tmpfile deve ser:

sys_get_temp_dir().'/CURLCOOKIE'.basename($_COOKIE['tmpfile'])

Embora parte do nome do arquivo seja salvo em cookies, ele não pode ser manipulado para acessar diretórios ou arquivos indesejados em seu sistema. Esta não é uma solução ideal porque ainda permite que os usuários manipulem o curl para ler outros arquivos de cookie. Como o tópico não é sobre cookies, não vou me aprofundar muito nesse assunto.