2012-03-17 4 views
1

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

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

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

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

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

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

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

ответ

0

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

+0

Они там, потому что я передаю их туда. Если бы они не были, это создавало новый файл cookie, потому что имя было бы другим. – Joey