CodeSky 代码之空

随手记录自己的学习过程

模拟登录新手入门教程

2016-05-15 12:28分类: JavaScript评论: 8

阅读本文,你能得到一些Cookie和Session的基本知识,模拟登录的分析思路,但是具体代码请自行实现。

今天早上起来折腾了一下模拟登录,主要是以前从来没干过,以为很有难度——实际上并没有,折腾了大概一到两个小时就完全搞定了。

这次讲的主要是分析的思路,因为代码太难看了所以暂时不提供代码,等好看了在放出。

我们以上海海事大学数字校园平台为例,主要是他是比较简单的系统,为什么说简单,之后我们会做说明。

首先,我们来说一下本次使用的道具:

Firefox + Firebug Postman Node.js+superagent+cheerio(本文不需要)

之所以选择这些,是因为他们能让我们的测试和开发极大的简单化,当然你也可以使用类似的道具去做。

在模拟登陆之前,我们要先清楚一点:服务器是怎么判断用户登录状态的——如果你曾经开发过网页,一定会很快告诉我:用Session。

那么服务器又是怎么确定Session和客户端的呢,答案是Cookie,我们摘取一张图解HTTP的图来说明问题:

这张图非常好的说明了Cookie与Session的关系,明白了这一点,我们也就明白我们的中心主旨了:就是获取Cookie。

下一步,我们就来针对HTTP请求进行人工查看。

首先,来了解一下Firebug的使用(如果你不会呼出Firebug/审查元素面板,那你可能不在本文的读者受众中,请先去学习一些基础知识)

我们可以通过HTML按钮来过滤CSS和JavaScript请求,专注于页面加载本身,然后我们看到了Response中的Set-Cookie,在首次访问时,才会在响应头有这一项,这是由Cookie的特性决定的(所以方便起见我开了隐私预览窗口):

关于这一点,我们也可以看图解HTTP的图:

首次访问:

之后访问:

接下来我们来试试登录:

等待完全载入完毕,我们会发现多了很多请求,一一来进行分析,主要还是看Request和Response,传入和返回的值的变化等。

这里我们从login开始,主要看三个面板:

注意:由于前面我们说明过,登录的关键在于Cookie,所以Cookie不能随便泄露(因此此处打上各种马赛克)。

这里新的Set-Cookie我们不确定有没有用,我们看之后请求头的Cookie信息,现在我们先从这里看出来了,要发什么信息(Post),用什么类型(Content-Type),登录成功会返回什么(响应),这里我们用Postman试试。

注意红色框出来的Content-Type。

然后我们Send之后会发现……咦,失败了——原因是lt不明,回到登录前的页面,我们去寻找lt是从什么地方传入的:

看得出来,多半是一个随机校验码,这个未使用过的,我们把它复制进去,结果是可以的,与我们手动登录的返回内容相同。

但是我们记得,之后还有一个302跳转和一个200,才到了我们最终的目的地,接下来开始考证他们是否有用。

先看我们目的地的Cookie:

似乎与首页的有些不太一样?

那么我们就怀疑是否是在跳转后的访问时顺便附带了点什么。

我们成功找到了Cookie的来源,顺便一提,是用post中响应结果的跳转去获得的。

之后带着这个Cookie,我们能否成功访问,测试一下就知道了(答案是可以哟)

为什么带着Cookie仍然需要测试,这是由于为了避免爬虫、机器登录等情况,一些网站会进行验证User-Agent(比较常见),Referer等行为,此时我们需要对这些也进行设置,才能成功访问。

总结一下,我们这里教大家的其实是一个寻找答案的过程,当然,这是一个最简单的模拟登录,非常适合练手,如果遇到验证码,或者其他复杂情况,就不难么好做了。

superagent和cheerio的用法,这里暂时就不多做解释了,官方文档写的非常明白。

在模拟登录之后,我们就能做很多事情了,其中包括了自己做API、深度爬虫等等,诸君各凭脑洞,想象空间还是很大的。

评论 (4)

bob2017年5月6日 11:42

好文

小虫子2016年7月21日 15:07

为什么同一段带参数的URL,用postman可以登录成功,然而在我自己的代码里面却失败呢?这个一般是什么原因呢?请楼主指点下。

敖天羽2016年7月21日 15:44

你好,POSTMAN会在运行POST后存储你的Cookie进他的Cookie List,之后你GET操作时POSTMAN会自动带上这部分的Cookie,你操作的时候需要人工设置Cookie。

SnakeHacker2016年5月30日 18:47

好文~

evercx2016年5月16日 00:55

你是怎么得到最终Cookie的来源的??我在跳转的响应头里没有set-cookie这个字段 不过url里却有jessionid(#゚Д゚)?

敖天羽2016年5月16日 10:23

见文中对于Cookie原理讲解部分