【问题标题】:HTTP Header POST Request with Curl带有 Curl 的 HTTP 标头 POST 请求
【发布时间】:2013-08-03 09:29:20
【问题描述】:

我用 Fiddler 抓取了以下 Post 请求,我只屏蔽了 URL,因为我不想做广告

POST http://xyz.com/dialogs/track HTTP/1.1
Host: www.xyz.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:10.0) Gecko/20100101 Firefox/10.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: de
Accept-Encoding: gzip, deflate
DNT: 1
Content-Type: application/json; charset=utf-8
X-CSRFToken: uuihXszJrkrXwnCkLKKDNQ8BrPRDqXvU
X-Requested-With: XMLHttpRequest
Referer: http://www.xyz.com/referer/
Content-Length: 2
Cookie: csrftoken=uuihXszJrkrXwnCkLKKDNQ8BrPRDqXvU
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

{}

我需要一个教程(链接会很有用)来用 Curl “伪造”这个请求,我在 Google 上找到了一些东西,但没有任何工作,我收到错误。

-编辑-

$headers = array(
'POST http://www.example.com/dialogs/track HTTP/1.1',
'Host: www.example.com',
'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:10.0) Gecko/20100101 Firefox/10.0',
'Accept: application/json, text/javascript, */*; q=0.01',
'Accept-Language: de',
'Accept-Encoding: gzip, deflate',
'DNT: 1',
'Content-Type: application/json; charset=utf-8',
'X-CSRFToken: uuihXszJrkrXwnCkLKKDNQ8BrPRDqXvU',
'X-Requested-With: XMLHttpRequest',
'Referer: http://www.example.com',
'Content-Length: 2',
'Cookie: __cfduid=d0db16cb5c4c58db770a1374f09a61d7d1375100590810; csrftoken=uuihXszJrkrXwnCkLKKDNQ8BrPRDqXvU; __utma=1.2111538523.1375265099.1375427020.1375431064.5; __utmz=1.1375348556.2.2.utmcsr=example.de|utmccn=(referral)|utmcmd=referral|utmcct=/game/index.php; __gads=ID=88f0a0a8b0698e1e:T=1375265099:S=ALNI_MYX8OxkwPxXQd7VY4qDImLK7fq_yQ; __utmb=1.4.9.1375431089319; __utmc=1',
'Connection: keep-alive',
'Pragma: no-cache',
'Cache-Control: no-cache',
'',
'{}'
);



//set POST variables
$url = 'http://www.example.com/dialogs/track';

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_HTTPHEADER, $headers);


//execute post
$result = curl_exec($ch);

//close connection
if (curl_error($ch)) {
print "Error: " . curl_error($ch);
}
else
{
var_dump($data);
curl_close($ch);
}

错误信息

错误:接收失败:对等方重置连接

-编辑 2-

我玩了一点,现在连接正常,但似乎 CSRF 令牌未正确提交,我收到错误!

禁止 (403)

CSRF 验证失败。请求中止。

他们有解决方案吗?

【问题讨论】:

  • 欢迎来到 Stack Overflow。您能否更具体地说明您目前已经写了什么,以及您收到了哪些错误?这将帮助我们弄清楚接下来需要做什么才能使其正常工作。您需要查看使用 curl_setopt(CURLOPT_HTTPHEADER, array(...)); 来设置与此请求中的标题完全相同的标题。如果没有更具体的信息,我想codular.com/curl-with-php 是我能指出的最好的。

标签: php post curl xmlhttprequest


【解决方案1】:

你的失踪:

curl_setopt($ch, CURLOPT_POST, true);

我认为您的问题不在于Curl,而在于CSRF 验证的工作原理。

假设向服务器发出请求,服务器设置会话(基本上是 cookie 中的字符串,用于识别服务器上的数据)。然后,您将该数据发回服务器,服务器将CSRF 令牌与链接到您也发回的COOKIESESSION 令牌进行比较。

您的请求中只有一个可能的会话 cookie - csrftoken(其他属于 google 和 cloudflare)。

这意味着 CSRF 令牌和会话标识符(csrftoken 值)完全相同,即 uuihXszJrkrXwnCkLKKDNQ8BrPRDqXvU,这不是 CSRF 验证的工作方式。

GET 响应返回时,您需要获取会话 cookie 和 CSRF 令牌并将它们都发送回去,一个作为 COOKIE 值,另一个作为 POST 值(可能是 2 个标头值,但2 个不同的值)当您发出 POST 请求时。

【讨论】:

    猜你喜欢
    • 2016-11-10
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多