眾所周知,HTTP連接是無(wú)狀態(tài)的,那么問(wèn)題來(lái)了,怎么記錄用戶的登錄信息呢?通常的做法是用戶第一次發(fā)送HTTP請(qǐng)求時(shí),在HTTP Server端生成一個(gè)sessionID,SessionID會(huì)對(duì)應(yīng)每個(gè)會(huì)話的狀態(tài)(比如是否登錄,等等),并且將SessionID保存在瀏覽器的cookies中。我們登錄一個(gè)網(wǎng)頁(yè)后,打開另外一個(gè)窗口訪問(wèn)相同的網(wǎng)頁(yè)不需要登錄,就是因?yàn)閮蓚€(gè)網(wǎng)頁(yè)都對(duì)應(yīng)同一個(gè)cookies。
有時(shí)在做python爬蟲時(shí),需要訪問(wèn)登錄后才可以訪問(wèn)的網(wǎng)頁(yè),利用已經(jīng)登錄的cookie文件就可以達(dá)到此目的。下面以迅雷網(wǎng)為例來(lái)做實(shí)驗(yàn),實(shí)驗(yàn)平臺(tái)為linux。
1. 首先在Firefox瀏覽器端登錄迅雷網(wǎng),使用Firebug插件導(dǎo)出cookies。
2. 修改cookies的格式,假設(shè)文件名為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 7463347910 .i.xunlei.com TRUE / FALSE 1498494348 __utmc 11257007611 .i.xunlei.com TRUE / FALSE 1435422925 __utmt 112 .dynamic.i.xunlei.com TRUE / FALSE 1451190348 __utmz 74633479.1435422349.1.1.utmcsr=i.xunlei.com|utmccn=(referral)|utmcmd=referral|utmcct=/login.html13 .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 143542234755615 dynamic.i.xunlei.com FALSE / FALSE 1435424148 _s19 1435770994546b1435422324953b2bhttp%3A//dynamic.i.xunlei.com/user
# cookies行數(shù)比較多,就不寫了,有三個(gè)地方注意:
# 1.第一行不能少,并且一個(gè)字符都不能錯(cuò)。
# 2.格式要嚴(yán)格為(空白處為TAB):
域 [TRUE或FALSE] / [TRUE或FALSE] 過(guò)期時(shí)間戳 名稱 內(nèi)容
3. 使用python代碼讀取xunlei.txt,并訪問(wèn)登錄后才能訪問(wèn)的網(wǎng)頁(yè),例如: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. 打印出來(lái)的代碼即為我登錄后,在http://dynamic.i.xunlei.com/user看到的內(nèi)容。
以上的原理與CSRF攻擊的原理類似,CSRF攻擊的就是利用非法獲得用戶cookies,偽裝成用戶進(jìn)行操作。針對(duì)這種攻擊,web站點(diǎn)可以生成token,HTTP Server會(huì)驗(yàn)證每次請(qǐng)求的token,來(lái)避免CSRF攻擊,例如Django的CsrfViewMiddleware。
但是token依然被放在了cookies中,依然可以進(jìn)行CSRF攻擊,只不過(guò)攻擊的方式復(fù)雜了些。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注