1. 程式人生 > >黑板課爬蟲闖關第三關

黑板課爬蟲闖關第三關

前面兩關算是比較容易,第三關就有些難度了,因為還需要有web方面的知識才能想到方法。第二關結束後,點選下一關,出來以下頁面:

這裡寫圖片描述

乍一看還以為進錯了,先不管,註冊登入再說。登入後才進入這個頁面:

這裡寫圖片描述

題目說比上一關多了兩層保護,我們可以看到頂部有個登出按鈕,也就是說首先要先登入才能繼續做題。根據我那薄弱的web知識,當時第一想法就是:第一,通過增加header偽裝瀏覽器;第二,拿我當前登入的cookie去登入。最後華麗地失敗了。

於是我開始觀察在登入的時候除了使用者名稱和密碼到底還發送了些什麼。開啟chrome->右鍵審查元素->網路,然後再輸入使用者名稱密碼登入,看右邊面板中的Form Data,也就是我們傳送的資料:

這裡寫圖片描述

圖中我們可以看到,除了傳送使用者名稱和密碼,我們還發送了一個csrfmiddlewaretoken的資料,這個資料是什麼呢?正好最近的web安全課裡講過csrf攻擊,也就知道點。那這個csrfmiddlewaretoken是怎麼來的呢?回到題目的頁面,重新整理下網頁,在Response Headers也就是伺服器響應的資料的Set-Cookie裡發現有個csrftoken的欄位:

這裡寫圖片描述

我們先記住這個值,然後再登入一遍,發現傳送的表單資料中的csrfmiddlewaretoken中的值就是這個:

這裡寫圖片描述

也就是說,每次登入的時候還要拿進入這個頁面伺服器給你的“csrftoken”作為你下次登入時的“csrfmiddlewaretoken”

和使用者名稱密碼一起傳給伺服器。
經過觀察還發現,登入“黑板課記賬”的時候用的也是相同的方法,這就是題目所說的“兩層保護”

# coding=utf-8
import requests

website1 = 'http://www.heibanke.com/accounts/login'
website2 = 'http://www.heibanke.com/lesson/crawler_ex02'
wrongNotify = '您輸入的密碼錯誤, 請重新輸入'

s = requests.Session()
s.get(website1)     # 訪問登入頁面獲取登入要用的csrftoken
token1 = s.cookies['csrftoken'
] # 儲存csrftoken # 將csrftoekn存入欄位csrfmiddlewaretoken dataWebsite1 = {'username': 'user', 'password': 'password', 'csrfmiddlewaretoken': token1 } s.post(website1, data=dataWebsite1) pwd = 1 while pwd < 30: # 以下步驟原理和上面一樣 s.post(website2) token2 = s.cookies['csrftoken'] dataWebsite2 = {'username': 'Thare', 'password': pwd, 'csrfmiddlewaretoken': token2 } result = s.post(website2, data=dataWebsite2) if wrongNotify in result.content: print '密碼%d錯誤' % pwd pwd += 1 else: print '密碼是%d' % pwd break