利用cookies获取登录后的网页

  众所周知,HTTP连接是无状态的,那么问题来了,怎么记录用户的登录信息呢?通常的做法是用户第一次发送HTTP请求时,在HTTP Server端生成一个SessionID,SessionID会对应每个会话的状态(比如是否登录,等等),并且将SessionID保存在浏览器的cookies中。我们登录一个网页后,打开另外一个窗口访问相同的网页不需要登录,就是因为两个网页都对应同一个cookies。

  有时在做python爬虫时,需要访问登录后才可以访问的网页,利用已经登录的cookie文件就可以达到此目的。下面以迅雷网为例来做实验,实验平台为Linux。

  1. 首先在Firefox浏览器端登录迅雷网,使用Firebug插件导出cookies。

  2. 修改cookies的格式,假设文件名为xunlei.txt,正确的格式如下:

 1 # Netscape HTTP Cookie File.
 2 # Generated by Wget on 2015-06-27 23:54:34.
 3 # Edit at your own risk.
 4 
 5 .dynamic.i.xunlei.com   TRUE    /   FALSE   1498494348  __utma  74633479.1276576155.1435422349.1435422349.1435422349.1
 6 .i.xunlei.com   TRUE    /   FALSE   1498494325  __utma  112570076.1792933177.1435422325.1435422325.1435422325.1
 7 .dynamic.i.xunlei.com   TRUE    /   FALSE   1435424148  __utmb  74633479.1.10.1435422349
 8 .i.xunlei.com   TRUE    /   FALSE   1435424125  __utmb  112570076.1.10.1435422325
 9 .dynamic.i.xunlei.com   TRUE    /   FALSE   1498494348  __utmc  74633479
10 .i.xunlei.com   TRUE    /   FALSE   1498494348  __utmc  112570076
11 .i.xunlei.com   TRUE    /   FALSE   1435422925  __utmt  1
12 .dynamic.i.xunlei.com   TRUE    /   FALSE   1451190348  __utmz  74633479.1435422349.1.1.utmcsr=i.xunlei.com|utmccn=(referral)|utmcmd=referral|utmcct=/login.html
13 .i.xunlei.com   TRUE    /   FALSE   1451190325  __utmz  112570076.1435422325.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
14 dynamic.i.xunlei.com    FALSE   /   FALSE   1498494348  __xltjbr    1435422347556
15 dynamic.i.xunlei.com    FALSE   /   FALSE   1435424148  _s19    1435770994546b1435422324953b2bhttp%3A//dynamic.i.xunlei.com/user
# cookies行数比较多,就不写了,有三个地方注意:
# 1.第一行不能少,并且一个字符都不能错。
# 2.格式要严格为(空白处为TAB):
域 [TRUE或FALSE]  / [TRUE或FALSE]  过期时间戳  名称  内容

  3. 使用python代码读取xunlei.txt,并访问登录后才能访问的网页,例如:http://dynamic.i.xunlei.com/user

下面为源代码:

 1 import cookielib, urllib2
 2 
 3 cookie = cookielib.MozillaCookieJar()
 4 cookie.load("xunlei.txt")
 5 handle=urllib2.HTTPCookieProcessor(cookie)
 6 opener = urllib2.build_opener(handle)
 7 urllib2.install_opener(opener)
 8 
 9 url = "http://dynamic.i.xunlei.com/user"
10 req = urllib2.Request(url)
11 response = urllib2.urlopen(req)
12 print response.read()

  4. 打印出来的代码即为我登录后,在http://dynamic.i.xunlei.com/user看到的内容。

 

  以上的原理与CSRF攻击的原理类似,CSRF攻击的就是利用非法获得用户cookies,伪装成用户进行操作。针对这种攻击,web站点可以生成token,HTTP Server会验证每次请求的token,来避免CSRF攻击,例如Django的CsrfViewMiddleware。

  但是token依然被放在了cookies中,依然可以进行CSRF攻击,只不过攻击的方式复杂了些。

posted @ 2015-06-28 02:16  有星星的夜  阅读(10451)  评论(0编辑  收藏  举报