我正在尝试复制一个表单提交,它使用PHP中的CURL来回收一些分析数据。我从fiddler复制了原始POST并用它来通知我的PHP脚本。
这是我的CURL功能
function executeCurl($data, $certificate=false) {
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, $data['header']);
curl_setopt($ch, CURLOPT_URL, $data['url']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data['postdata']);
curl_setopt($ch, CURLOPT_POST, $data['post']);
curl_setopt($ch, CURLOPT_COOKIE, $data['cookie']);
curl_setopt($ch, CURLOPT_HTTPHEADER, $data['httpheader']);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
if($certificate) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "\DigiCertHighAssuranceEVRootCA.crt");
}
//execute post
$result = curl_exec($ch);
我收到服务器的回复,但帖子数据已被忽略。这是我的POST请求。
POST /report.aspx?tid=3477 HTTP/1.1
Host: blah.com
Cookie: somecookies;
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: https://blah.com/report.aspx?tid=3477
Accept-Language: en-GB,en;q=0.8,en-US;q=0.6
Content-Length: 7418
Expect: 100-continue
$ data ['postdata']值是我从Fiddler复制的url编码数据字符串的精确副本。其余的标题是相同的,除了Expect:100-continue标题,由CURL添加。
您可以看到内容类型已正确设置。
此外,正在使用HTTPS,无论我是否使用证书都没有区别。
所以,我从服务器得到一个响应但是忽略了post字段。有没有人对这可能是什么有任何建议?
提前致谢。
编辑将“Expect:”添加到我的HTTPHEADER意味着POST现在看起来如下,但服务器仍然没有响应发布的数据。
POST /report.aspx?tid=3477 HTTP/1.1
Cookie: blah
Host: blah.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: https://blah.com
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: https://blah.com/report.aspx?tid=3477 HTTP/1.1
Accept-Language: en-GB,en;q=0.8,en-US;q=0.6
Content-Length: 7418
答案 0 :(得分:1)
据我了解,除非服务器在收到该标头后以100继续响应,否则cURL不会发送有效负载。请尝试curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
禁用此期望。
答案 1 :(得分:0)
我两次访问该页面解决了这个问题。一次检索__VIEWSTATE,PagePostbackID和PublicKeyToken变量。
我第二次在请求中使用这些变量并且POST工作了。