您的位置:首页 > 编程语言 > Python开发

python—如何使用post进行登录操作与非对称加密的破解

2017-08-29 01:50 681 查看
。,。笔者最近正在学习网络爬虫,而在爬取数据的过程中,登录是一个很棘手的问题,但有一些信息却只有登录之后才能获取到。在课程的学习后,我也查看了一些网上关于程序如何处理登录的文章,小有收获,作为初学者,文中的错误和不足希望不吝指教。

       在设计爬虫程序处理登陆问题的时候,总的方式有两种,一是使用selenium模拟人的操作,由于selenium可以使用html和script的代码,我们可以在找到输入用户名和密码的标签后,直接用命令对其赋值,然后再用.click点击登陆就可以成功登陆了。这种方法优点是特别简单,不需要去分析什么东西,缺点就是太慢了,我们一般采用这种方法登陆获取cookies,然后传给爬虫程序。除了这种方法,我们还可以使用post进行登录。

     post方式登陆也分成了两种情况,一种是单纯的表单形式登陆,另一种是ajax。单纯的表单登陆我理解成我们将数据传输到服务端,请求一个url,通过后页面跳转。ajax方式则是我们将数据传输后,返回一堆javascript代码来对网页进行修饰。

     这次我们选取的对象还是新浪微博,不过我们将微博的移动端和PC端分开。移动端较为简单,不涉及到加密数据等操作,PC端则相当复杂,我在查阅了相关的很多文章之后才能成功破解。

    先是对移动端的分析.



  我们打开开发者工具,先输入用户名,不输入密码,能够看到网页在我们输入了用户名之后有了一个prelogin的script文件,打开其requests请求的链接



     我们得到了一个json的文件,不过在移动端登陆的时候我们还用不到它。

      


       

.,。接下来随便输入一个密码登陆,我们在开发者工具中可以看到网页发送了一个ajax的logIn请求,这毫无疑问就是我们登陆时的请求。而我们关注的重点也就是登陆请求中的 form_data表单传输的数据,和login所对应的requests请求的url链接。

     其中,form_data本质上我们输入的数据,而网页对其进行了封装加密的处理,然后传给服务器,服务器检查我们传输的数据,据此来做相应的处理。

在图中我们可以看到,新浪微博移动端对我们所传输的数据并没有加密(太不安全了吧),而是单纯的使用了-www-form-urlencode表单的数据格式,直接用了&来连接各个数据,这也是为什么说移动端很简单。搞清楚了大概的流程,我们就可以直接写程序开始登陆了。

>>> login_url="https://passport.weibo.cn/sso/login"
>>> rdata = {'username':'用户名','password':'密码'}
>>> re2 = requests.post(url=login_url,data=rdata,headers=headers2)设置好你的headers,直接使用requests的post方法就可以成功登陆了,不过网页一般会存在登陆跳转的情况,如果直接用这种形式登陆,我们无法保存登陆后获取到的cookies,在网页跳转之后就会报错,对此我们可以使用requests的session对象,动态的保存我们的cookies。
pc端的登陆则比较复杂。



在刚进入网页之后就有一大堆杂七杂八的请求出现,不过我们输入用户名之后,prelogin又一次出现了。打开它的requests请求url



依旧是熟悉的json文件,里面出现了pubkey,代表着加密的方式是非对称加密,这里可以提一下非对称加密的概念,在我们与服务器通信的过程中,为了防止信息泄露,必须对传播的信息加密,非对称加密的意思是我们和服务器各自拥有自己的公钥和私钥,传播过程中将自己的公钥给对方,用私钥加密,传输到服务器后,服务器用得到的公钥解开。


我们输入密码开始登陆,点击登录后又是一大堆请求和文件,经过查找,我们将login.php定位为登陆请求的文件,里面的form_data就是我们表单中填写的数据经过了新浪网页的加密之后的样子。

这就体现出了PC端和移动端的区别,移动端根本不存在加密这回事,所以我们可以直接使用上面的post方法,包装用户名和密码之后直接post传输过去就可以登录成功,而这里的数据看起来则更像是一团乱码。需要我们去分析网页中的script文件才能得出它加密的方式。

entry:weibo
gateway:1
from:
savestate:7
qrcode_flag:false
useticket:1
pagerefer:
vsnf:1
su:MTg4ODMyNDMzOTk=
service:miniblog
servertime:1503946643
nonce:9H5KEB
pwencode:rsa2
rsakv:1330428213
sp:164b17e2afeca970bda2bc07d3629bd1ec6f2a121aae9fb6c98b6099ffc38ca3c26d08ff422cb301fe9978ce8e4affd1a3eab1a7895590aa589411f992af053e70bd947217b85f7ff9ccc36d2c24b1c380008e8bc7f47f9d2660062eed264b72b116404cda69aa32a4a4681f1aab59ab77f9f030e956da434191da0496110166
sr:1920*1080
encoding:UTF-8
prelt:38
url:http://www.weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack
returntype:META我们来看看post出去的这一堆数据,,里面值得注意的有su,rsa,sp,这三个数据,不难猜测,su就是我们的用户名,sp则是我们的密码,他们经过加密之后就变成了现在这个样子,rsa则是加密的方式。
我们接下来要做的就是对我们程序中的data数据进行同样的加密处理,让它变成上面这种形式,这样才能得到服务器的相应。

不过新浪似乎不止做了一层加密,但大概的解决思路就是这样,对这种ajax请求登陆的网页,我们只有从script文件和url链接入手,反推出form_data的加密方式,然后用同样的方法去封装我们的数据,post传输过去才能得到服务器的响应登陆成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: