利用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攻擊,只不過攻擊的方式復雜了些。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM