curl请求和浏览器请求有区别吗?

itwriter 发布于 2017/01/19 14:20
阅读 3K+
收藏 0

使用chrome的功能“copy as cURL(bash)”,把curl命令拷贝出来,用curl执行,不能得到正确的200响应,服务器返回401授权错误.

但用浏览器打开这个请求(在network标签页点击该请求是一点问题都没有,返回200,返回信息正常。

这是为什么呢?https的问题吗?还是说curl请求和浏览器请求有区别,服务器识别出来,并给curl的机器请求返回401?


这是copy出来的curl命令, 可能涉及隐私的信息用*号代替:


curl 'https://web.jingoal.com/mgt/workbench/v1/get_userconfig?code=******&ouri=https%3A%2F%2Fweb.jingoal.com%2F&b1484813013899=1' -H 'Cookie: JSESSIONID=<span></span>**************<span></span>; cScheme=https%3A; TOURL=http%3A%2F%2Fweb.jingoal.com%2Fwebcd%2Fplan%2Frefworklog%2FhasPlans.do; route=d9bb01f04efcc1fb0b7f53808b4b71ae; ouri=https%3A%2F%2Fweb.jingoal.com%2F; _ga=GA1.2.218092510.1484302843; _gat=1; Hm_lvt_586f9b4035e5997f77635b13cc04984c=1484633994,1484704757,1484794394,1484812999; Hm_lpvt_586f9b4035e5997f77635b13cc04984c=1484812999; code=dr45nJ' -H 'Accept-Encoding: gzip, deflate, sdch, br' -H 'Accept-Language: zh-CN,zh;q=0.8' -H 'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' -H 'content-type: application/json' -H 'accept: application/json' -H 'Referer: https://web.jingoal.com/?code=*****&state=%7Baccess_count:1%7D' -H 'x-requested-with: XMLHttpRequest' -H 'Connection: keep-alive' --compressed


复现步骤:

1. 在今目标这个网站注册个帐号

2. 打开chrome的开发者工具,登录

3. 找到"get_userconfig"这个请求,点击

=>你会发现,请求是可以获得正确响应的,多少次都可以。

4. 右键该请求,“copy as cURL(bash)”, 执行(当然cmd也行的)

=>然后就会发现,服务器返回了401


看了看copy出来的curl命令,我想到的没想到的信息都具备了,所以我觉得问题出在curl上。


加载中
1
gk4030
gk4030

chrome跟踪了下,发现:

curl的cookien必须携带下面这些参数才能通过

JSESSIONID

Qs_lvt_1742

ouri

Qs_pv_1742

JINSESSIONID

aid

lang

route

但是curl获取登录的cookie中只有JSESSIONID,route,

# jinmuburl="https://sso.jingoal.com/oauth/authorize?client_id=jmbmgtweb&response_type=code&state=%7Baccess_count%3A1%7D&locale=zh_CN&redirect_uri=https%3A%2F%2Fweb.jingoal.com%2F#/login"

# curl -v -X GET -c cookie.jingoal -d "username=${username}&password=${password}" ${jinmuburl}

# curl -v -X GET -b cookie.jingoal -k https://web.jingoal.com/mgt/workbench/v2/navigationConfig?b$(date +%s)043=1

此时返回{"meta":{"code":401,"message":""}}

 

curl -v -X GET --cookie 'JSESSIONID=14431AFA0871DCE2B7F6AD589AF84F18.mgt133; Qs_lvt_1742=1499506983%2C1500717485%2C1500779513; ouri=https%3A%2F%2Fweb.jingoal.com%2F; Qs_pv_1742=2818183671604288000%2C1425039735485791200%2C955534531043689700%2C4016141865564215300%2C1426903403399036400; JINSESSIONID=c968f63a-7d42-47ca-b3b3-6aad25ea14a7; aid=""; lang=zh_CN; route=3ef7bca7cb29365203b7cde554ea9974' -k --header 'web.jingoal.com' --Referer 'www.jingoal.com' --user-agent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'  "https://web.jingoal.com/mgt/workbench/v1/get_notification_msg?b$(date +%s)083=1"

就能登录

{"meta":{"code":200,"message":"请求成功"},"data":{"noti_total":0,"noti_list":[]}}

1
二两棉
二两棉
可能有token, 为了防止重复提交请求,以一个充值页面举例:
在你请求充值页面的时候,server会先返回一个token, 这个token藏在页面的某个地方,或者放到cookie里
等你填好金额时,再点提交按钮时,会带着这个token一起请求,一旦这个请求提交给server,
server就会标记这个token失效,如果你再用这个失效的token请求的时候,就会提示401错误了
itwriter
itwriter
不是token的问题,我的锅,没说清楚。在开发者工具的network标签页点击该连接,是可以打开的,可以发送多次请求并得到正确的结果。所以可以确定不是token的问题。但执行拷贝出来的curl命令就不行。
1
如比如比
如比如比
http的时候,报文头是有区别的https://linux.cn/article-4957-1.html
如比如比
如比如比
回复 @itwriter : 既然客户端都很完美了,就服务器端区别对待了,我这里是检查会话和时序的,和服务器预设的不吻合就给踢出
itwriter
itwriter
有点道理,但不适用于这里例子中。文章里介绍的报文头不一样,是因为使用者没有任何指定,默认的和浏览器不一样。但我这里是从浏览器中“copy as cURL”的,没有信息遗漏,就连浏览器信息都一并拷贝过去了。
0
ddatsh
itwriter
itwriter
对,之前做过登录操作。具体信息我补充在问题描述里了,感觉copy出来的curl应该没什么遗漏,该有的都有了。
ddatsh
ddatsh
回复 @itwriter : header里有什么?之前进行过登陆?
itwriter
itwriter
cookie也是有的,“copy as cURL”的功能会把cookie也拷贝出来。
返回顶部
顶部