眾所周知,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攻擊,只不過攻擊的方式復雜了些。