分析登录过程的话有很多工具可供选择,Fiddler等抓包工具都是很好的选择。不过这次不需要,由于登录过程需要在浏览器上完成,所以我们这次直接使用浏览器的F12开发人员工具。火狐、Chrome、Edge的F12工具都差不多。这次我就以Edge的为例来说明。
熟悉调试工具
一开始由于我的调试姿势不正确,所以浪费了很多时间。在这里我把我的人生经验分享一下。其实很简单,就是一句话:浏览器必须进入隐私模式。因为浏览器有可能保存以前的登录信息、cookie等,对分析工作造成混淆影响。所以我们必须不断地调试不断地清除数据。不妨直接进入隐私模式,这样所有东西都是新的,方便我们分析。
来上两张图看看。首先是调试工具。在这里我们主要看的就是cookie的值。网页登录的每一步骤我们都需要看看新增加了什么cookie,哪些cookie在登录过程中是必要的。这需要我们一步一步分析。
调试程序第二个部分就是网络标签。在这里就是我们主要分析的地方了。登录过程中哪一部分发送了什么类型的数据、发到了哪个URL、服务器返回了什么结果,都需要我们分析,然后模拟出登录过程。这里横排的几个按钮还可以清除缓存、cookie、记录等等,如果我们需要重复分析,这几个按钮是非常方便的。
网络标签这里有一个小技巧,那就是内容类型这里。一个网页常常包含了很多静态文件、需要从很多CDN返回图片等,但是这些都是和登录内容无关的东西。所以我们可以在这里选择需要查看的内容,图片之类的几乎完全可以忽略(当然如果遇到验证码,还是需要分析一下)。
内容过滤如果还有什么不熟悉的地方,最好自己打开几个网页,然后用开发人员工具看看。一个合格的程序员,利用调试工具的技能肯定是必不可少的。另外Edge的开发人员工具是中文的,对于英文不好的同学还是很友好的。
登录过程分析
获取BAIDUID
按照上面的技巧,打开一个隐私模式网页,然后把开发人员工具调教到合适的位置。然后进入百度主页面www.baidu.com
。回到调试工具看看浏览器在这一步做了什么。
首先第一步是访问了https://www.baidu.com/
这个地址,作用是设置了BAIDUID这个cookie。后续的请求我们都需要附上这个cookie。该cookie只有在附有UA的时候才会返回。
获取登录token
然后我们点击百度首页右上角的登录,看看会发生什么。这一步步访问https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&tt=1491554358163&class=login&gid=134D887-FD18-4D86-AED8-0880DCA39820&logintype=dialogLogin&callback=bd__cbs__m6q67t
这个地址,可以看到它带了很多参数。其中只有两个参数需要我们注意:一是tt参数,代表当前时间的毫秒数;二是gid,也就是GUID,我们用Python代码就能生成。其他参数不变就行了。
这一步如果成功的话,服务器就会返回一个JSONP。这里最重要的就是data中的token了。我们后续的登陆请求就需要这个玩意。
bd__cbs__m6q67t({
"errInfo": {
"no": "0"
},
"data": {
"rememberedUserName": "",
"codeString": "",
"token": "7ddcb9b9dd7b57623a77730c53b4df76",
"cookie": "1",
"usernametype": "",
"spLogin": "rate",
"disable": "",
"loginrecord": {
"email": [],
"phone": []
}
}
})
获取验证码
这时候页面上应该已经弹出登录对话框了,有时候好像还是直接在页面上登录。这几种登录方式没有区别,只不过上面的logintype参数可能会有不同的值,这不会影响我们的登录过程。
在登录框中输入用户名,当输入密码的时候会弹出验证码。然后我们返回开发工具看看浏览器做了什么。
这次发出的请求URL是https://passport.baidu.com/v2/api/?logincheck&token=7ddcb9b9dd7b57623a77730c53b4df76&tpl=mn&apiver=v3&tt=1491497010074&sub_source=leadsetpwd&username=%E9%82%AA%E7%8C%AB%E9%98%BF%E6%9E%AB&isphone=false&dv={dv}&callback=bd__cbs__p5fzjy
,这个URL其实很长,因为有一个很长的dv参数。这个dv参数是登录页面隐藏表单域的一个部分,用的时候把它取出来即可。变化的只有一个编码的用户名参数,剩下的基本都是固定值。
我们看到这个请求用到了用户名,所以对于每个不同的用户名,都会重新发送一次请求。如果你在登录框中更改了用户名,那么就会浏览器就会重新发送请求,顺便验证码也会刷新。
请求返回的结果同样是JSONP。重点就是codeString和vcodetype两个参数了。
bd__cbs__p5fzjy({
"errInfo": {
"no": "0"
},
"data": {
"codeString": "tcG7d07e2dcb2f8c18d02dc14669801a07b9bcd440666043195",
"vcodetype": "46dbjrl3l5wu82vPoSiQz/tmNWQIm1xOR0JMD0I7U/UjpgY6Sye/mCtpzMJEvJTK3PJ2hGntFKiNnDNLxjd3bmxt7FlJ3yaomPUj",
"userid": "",
"mobile": ""
}
})
由于我们把图片的请求过滤了,所以调试工具只给出了这些请求。下面我们把图片那一项选中,然后在网页上选择更新验证码,看看会出现什么。
这次请求图片的URL是https://passport.baidu.com/cgi-bin/genimage?tcG9c07c1deb266c1790286146443019a7f46b1430702017e69
,这里的参数正是上面的codeString。而这个请求的返回值正是验证码图片。每次重新请求,都会发送一个新的验证码图片。看到这里,图片这一块的问题就解决了。我们可以选择再次过滤图片请求。
然后我们在网页上填写验证码,浏览器会将验证码发送给服务器验证。在开发人员工具中可以看到,这次的请求是https://passport.baidu.com/v2/?checkvcode&token=7ddcb9b9dd7b57623a77730c53b4df76&tpl=mn&apiver=v3&tt=1491499485871&verifycode=BFIM&codestring=tcG3907c1deb2eac174026314a24301df7f5820430750017e35&callback=bd__cbs__66bgjs
,verifycode参数正是我们填写的验证码,剩下的参数都已经介绍过了。这次请求返回的结果会提示验证码输入是否正确。
获取密钥
浏览器还会发送请求https://passport.baidu.com/v2/getpublickey?token=571fd331d62e4c8dc56c4c9a8788e0b8&tpl=mn&apiver=v3&tt=1491559255612&gid=027CF18-F8F4-47EB-BD7C-A48337DD5F8F&callback=bd__cbs__m915m4
来获取加密密码的密钥。
请求的结果就是下面的JSONP,包含了公钥pubkey和密钥key。
bd__cbs__ksjbq7({"errno":'0',"msg":'',"pubkey":'-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXN3F7epcT2k2yjuw95Nd3iEDS\nz04mTwPUAOaZIQ+JWtawDWMh6+hpwnT8STs1fa5CZwb1L\/nam4zqu\/Y4zETCp\/uL\nSl8\/6jdNsjVtiyq+IlQ0IkmPHiSk022BfBw0RGrSMUGuPPvdjy0eJ5a5pzRYWfK7\nvJ0QdYEdTovg7hm70QIDAQAB\n-----END PUBLIC KEY-----\n',"key":'KTS4sxpzVAnKxSxAej7ZfPgZE5neIy85'})
最终登录
当验证码填写正确的时候,我们就可以点击登录按钮登录了。这次会向https://passport.baidu.com/v2/api/?login
发送一个POST请求,请求体就是登录所需要的全部信息了。
这些信息非常多,不过所有所需信息都在上面解释过了。唯一需要注意的就是password参数,这需要通过上面获取的密钥进行加密。非常遗憾的是,具体的加密算法我没有找到。看那些参数的名字我猜应该是RSA加密,可惜我没有从百度的一大堆JS中找到那段加密代码。
apiver: v3
callback: parent.bd__pcbs__6j4pna
charset: utf-8
codestring: tcG0407c116b36dc11202ae14e24301427f443077f047e16
countrycode:
crypttype: 12
detect: 1
dv: MDEwAAoAyAAKAIAACAAAAF0HLFwIAFcjL5-f3lKfG9Nz7y7PS6s3kzZDthxYCACLqnvXF69nt3eXQ5t7q0-Pb4tDk1ObX49rr3ujY69vq2-_bBQIABMvLy8EBAgAGy8nJxkK0FQIACMvLypHWOjiiBAIABsnJy8r_zQICABDKysrKrq6ur_SzX1wICjsP
gid: E2D73BA-FC75-44B1-A051-BA0E6B4F9ED9
idc:
isPhone:
loginmerge: true
logintype: dialogLogin
logLoginType: pc_loginDialog
mem_pass: on
password: k2KCYNYLju5rt08imdZGdavn62s71kGnHYiALR%2FmZMmKfw2WgkNdkuddhqIm7QtSokqs84nDqyBh67cZRUV79iAEllJjO0l3lq1RMBmR49hMS1iKsIFiPUe%2F7NkooiVvaYCDqtZH1tHw3AtUkVKuL9O9lHswDDn%2Bwy9WTs%3D
ppui_logintime: 91424
quick_user: 0
rsakey: 8qbRUQebUUsasdmeawvQNIAGvJqgT3DD
safeflg: 0
splogin: rate
staticpage: https%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html
subpro:
token: 422d13308efaf3fb8aa05606c13147cc
tpl: mn
tt: 1491560392290
u: https%3A%2F%2Fwww.baidu.com%2F
username: %E5%86%B7%E6%BC%A0%E5%B0%98%E4%B8%96
verifycode: %E6%9A%82%E5%81%9C
所以这篇文章只能到这里结束了。不过现在百度账号的安全机制也比较完善了,基本上绕不过验证码这道工序,也就是说无论如何都必须人工登录。所以有这功夫研究登录过程不如直接把BDUSS
参数复制过来省事,而且也更加安全。
网友评论