我有一个脚本,可以从外部网站下载并显示网页。该站点生成一次性令牌并将其存储在隐藏的表单字段中,并将相同的令牌放入它发送给用户的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文件,当我打开它时,它会有一次性标记,并且它与隐藏表单字段中的标记相匹配。
当我提交表单时,我使用相同的cookie发出另一个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);
第二次cookie文件名应该相同,因为用户的ip,agent和target原始url没有改变。我已经验证它不会为请求创建第二个cookie,也不会覆盖第一个cookie。
但是当我提交表单时,CSRF验证失败,即使我没有更改隐藏的表单字段,它匹配cookie中的一次性令牌,我将HTTP引用设置为目标URL。还有其他原因导致CSRF检查失败吗?是不是出于某种原因在第二个请求中使用了cookie?感谢任何帮助,谢谢:)
答案 0 :(得分:0)
您可能需要重新定义变量。您的$agent
和$url
在几秒钟内没有cURL请求。