2011-10-02 92 views
2

我在想,如果我訪問使用Python的機制保護網站的密碼,我會得到它需要認證數據401未授權錯誤。如何使用python訪問受密碼保護的站點?

所以我的劇本里,我試圖訪問我的雅虎郵箱,這顯然需要用戶名和密碼,我想我會得到401,但我沒有。

代碼:

yahoo_mail = 'http://mail.cn.yahoo.com' 
br = mechanize.Browser() 
r = br.open(yahoo_mail) 
print r.info() #here, I got 200, it's ok apparently 

br.select_form(nr=0) #select the login form 
r = br.submit() #submit the form without providing username and password 
print r.info() #but I didn't get 401, why? 

問:

  1. 爲什麼我沒有拿到401無需提供身份驗證,信息?
  2. 如果不是我的信箱,其他任何網站可以給我一個401?
+0

我想你的意思是401未經授權,而不是410飄 – greg0ire

回答

5

大多數網站這幾天使用HTTP認證。因此,如果您未能登錄,則401不會返回;而是返回一個正常的200個成功響應,並且文本內部的網頁上顯示您沒有登錄。

相反,網站使用Cookie。這意味着您的瀏覽器實際上並不知道它登錄的網站;當你最終爲Yahoo!提供了一個成功的密碼時,它會更改它存儲在瀏覽器中的cookie,或者甚至保持cookie相同,但只是更改與cookie關聯的數據庫記錄。

因此,在登錄過程中,HTTP狀態代碼通常是無用的。相反,您將不得不刮取「200成功」頁面的文本,看看它是否恭喜您登錄或重複表單;或者,您也可以選擇檢查返回的網頁的網址,然後再查看它是否爲登錄表單,或者它是否是您想要訪問的目的地。

0
  1. 驗證失敗並不意味着你不能看到後面的認證頁面。這意味着您將不會看到此頁面的版本將您的憑據考慮在內。如果您在主頁上但未能通過身份驗證,您仍然可以看到首頁。

  2. 搜索引擎似乎並沒有指數401頁,所以它可以是一個有點難找...

0

它看起來像雅虎只是在處理其代碼的密碼驗證。嘗試將以下兩行添加到您的代碼中:

f = open('a.html', 'w') 
f.write(r.read()) 

當您閱讀該頁面時,您將再次看到相同的頁面。

看起來他們只是有一些JavaScript,告訴你你的密碼是錯誤的。

+0

你在正確的軌道上在實現身份驗證可能不通過HTTP完成,但通過Javascript密碼身份驗證就不會是安全的*所有*。正如Brandon的答案所示,他們在服務器端代碼中進行密碼驗證,並在客戶端存儲cookie。 – Rob