我有一个脚本,它使用大量的cURL来登录站点并提交一系列表单,但由于cURL请求返回302并重定向到块/端点页面,因此最近停止了工作。如果我使用浏览器执行相同的操作,我没有重定向,只有200 OK。
我的cURL正在使用登录过程返回的cookie,所以我认为会话没有被删除。
我原本以为在给定重定向位置的情况下,CSRF令牌(某种类型)丢失,并且该过程中的后续表单(使用浏览器)包含隐藏的CSRF令牌字段,但URL不需要发布数据
cURL和响应如下:
curl_setopt($ch, CURLOPT_URL, 'https://*******.********.co.uk/Dispatcher?menuid=pos_home');
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_HEADER, 0);
$content = curl_exec ($ch);
echo "CURL INFO : <BR/><pre>" ;
print_r(curl_getinfo($ch));
返回:
Array
(
[url] => https://*******.********.co.uk/Dispatcher?menuid=pos_home
[content_type] => text/html
[http_code] => 302
[header_size] => 253
[request_size] => 332
[filetime] => -1
[ssl_verify_result] => 20
[redirect_count] => 0
[total_time] => 0.142718
[namelookup_time] => 2.4E-5
[connect_time] => 2.4E-5
[pretransfer_time] => 9.0E-5
[size_upload] => 43
[size_download] => 327
[speed_download] => 2291
[speed_upload] => 301
[download_content_length] => -1
[upload_content_length] => 43
[starttransfer_time] => 0.142659
[redirect_time] => 0
[certinfo] => Array
(
)
[primary_ip] => nnn.nnn.nnn.nn
[primary_port] => 443
[local_ip] => nnn.nnn.nnn.nn
[local_port] => 53154
[redirect_url] => https://*******.********.co.uk/Dispatcher?menuid=badorMissingCSRFT
)
如果有人有任何想法,为什么或如何服务器可以为浏览器请求提供不同的cURL响应,我将非常感激 - 谢谢。
答案 0 :(得分:2)
您需要遵循重定向:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
不遵循重定向的其他原因:
4.14重定向在浏览器中工作,但不能用于卷曲!
curl支持HTTP重定向正常(参见第3.8项)。浏览器通常支持至少两种其他方式来执行卷曲不会重定向:
元标记。您可以编写一个HTML标记,该标记将导致浏览器在一定时间后重定向到另一个给定的URL。
的Javascript。您可以编写嵌入HTML页面的Javascript程序,将浏览器重定向到另一个给定的URL。
没有办法让卷曲跟随这些重定向。您必须手动确定页面设置要执行的操作,或者编写一个解析结果并获取新URL的脚本。
来源:http://curl.haxx.se/docs/faq.html#Redirects_work_in_browser_but_no
答案 1 :(得分:0)
也许服务器开始检查User-Agent:
或Referer:
HTTP标头。
尝试嗅探浏览器发送的请求(现代浏览器的开发人员工具告诉您请求的外观)并更新cUrl
代码以匹配浏览器发送的请求。
另请考虑您在问题评论中收到的建议(询问网站所有者或仅停止自动收集网站)。
答案 2 :(得分:0)
使用-L或--location选项进行卷曲以遵循重定向。
curl -L google.com