У меня есть сценарий, который загружает и отображает веб-страницу с внешнего сайта. Сайт генерирует одноразовый токен и сохраняет его в скрытом поле формы и помещает тот же токен в 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 должно быть одинаковым во втором случае, поскольку исходный URL-адрес пользователя, агента и целевого URL-адреса пользователя не изменился. Я проверил, что он не создает второй файл cookie для запроса и не перезаписывает первый.
Но когда я отправляю форму, проверка CSRF терпит неудачу, хотя я не изменял поле скрытой формы, и оно совпадает с одноразовым токеном в файле cookie, и я устанавливаю HTTP-референт на целевой URL. Есть ли еще одна причина, по которой проверка CSRF потерпит неудачу? Не по какой-то причине не использует файл cookie во втором запросе? Любая помощь приветствуется, спасибо 🙂
Возможно, вам придется переопределить переменные. Ваш $agent
и $url
не существует в секундах cURL-запроса.