cURL: два отдельных запроса, один и тот же сеанс - PullRequest
1 голос
/ 17 марта 2012

У меня есть скрипт, который загружает и отображает веб-страницу с внешнего сайта.Сайт генерирует одноразовый токен, сохраняет его в скрытом поле формы и помещает тот же токен в файл cookie, который он отправляет пользователю.В моем первом запросе cURL я сохраняю cookie:

$url = 'http://www.example.com/form.php';
$host = parse_url($url, PHP_URL_HOST);
$referer = 'http://' . $host;
$ip_address = $_SERVER['REMOTE_ADDR'];

// Give the user a unique cookie file for each request
$cookie_file = 'cookies/' . sha1($ip_address . $agent . $url) . '.txt';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPGET, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIESESSION, false);

$file = curl_exec($ch);

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

Когда я отправляю форму, я делаю еще один запрос cURL, используя тот же файл cookie:

$ch = curl_init($url);

$postdata = http_build_query($postdata);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
$ip_address = $_SERVER['REMOTE_ADDR'];
$cookie_file = 'cookies/' . sha1($ip_address . $agent . $url) . '.txt';
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch);

Имя файла cookie должно совпадать с именем файла cookie.во второй раз, поскольку IP-адрес пользователя, агент и целевой URL-адрес не изменились.Я убедился, что он не создает второй файл cookie для запроса и не перезаписывает первый.

Но когда я отправляю форму, проверка CSRF завершается неудачно, даже если я не изменилсяскрытое поле формы, и оно совпадает с одноразовым токеном в cookie, и я установил HTTP referer на целевой URL.Есть ли другая причина, по которой проверка CSRF не удалась?Разве это не использует cookie во втором запросе по какой-то причине?Любая помощь приветствуется, спасибо:)

1 Ответ

0 голосов
/ 18 марта 2012

Возможно, вам придется переопределить ваши переменные. Ваши $agent и $url отсутствуют в течение нескольких секунд cURL-запрос.

...