0

我正在尝试复制一个表单提交,该表单提交使用 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 编码数据字符串的精确副本。除了由 CURL 添加的 Expect: 100-continue 标头外,其余标头相同。

您可以看到内容类型设置得当。

此外,正在使用 HTTPS,无论我是否使用证书都没有区别。

所以,我得到了服务器的响应,但帖子字段被忽略了。有人对为什么会这样有任何建议吗?

提前致谢。

编辑将“期望:”添加到我的 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
4

2 回答 2

1

据我了解,除非服务器在收到该标头后以 100 Continue 响应,否则 cURL 不会发送有效负载。尝试curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));禁用这种期望。

于 2013-11-14T17:55:37.650 回答
0

我通过访问该页面两次解决了这个问题。一次检索 __VIEWSTATE、PagePostbackID 和 PublicKeyToken 变量。

我第二次在我的请求中使用这些变量并且 POST 工作。

于 2013-11-15T11:45:48.430 回答