天天看點

Cookies欺騙分析與防護

今天來談談cookies欺騙是怎麼回事以及如何避免。

使用者在登入之後通常會儲存使用者資訊,以便在其他需要權限的頁面去驗證使用者資訊是否具有通路權限。

有同學說我在登入的時候已經很注意SQL注入問題了,還有什麼不安全的地方麼?

當然有!這個要首先談一個問題,那就是使用者身份驗證的流程 如下圖:

Cookies欺騙分析與防護

是以我們可以看出,一個頁面是否能夠被通路,判斷依據是通過存儲資訊區域中使用者的資訊來判斷的

而登入頁面的作用就是 驗證 使用者輸入的使用者名+密碼的組合是否在資料庫中存在,如果存在則把資訊儲存在存儲資訊的區域,以便各個頁面去判斷權限

OK,理清這個思路之後我們的重點就來了,那個資訊存儲區域對于我們來說至關重要,一般常見的有兩種形式,session和cookies

session和cookies同樣都是針對單獨使用者的變量(或者說是對象好像更合适點),不同的使用者在通路網站的時候 都會擁有各自的session或者cookies,不同使用者之間互不幹擾。

他們的不同點是:

1,存儲位置不同

session在伺服器端産生,比較安全,但是如果session較多則會影響性能

cookies在用戶端産生,安全性稍弱

2,生命周期不同

session生命周期 在指定的時間(如20分鐘)到了之後會結束,不到指定的時間,也會随着浏覽器程序的結束而結束。

cookies預設情況下也随着浏覽器程序結束而結束,但如果手動指定時間,則不受浏覽器程序結束的影響。 

由于如果使用者資訊使用session儲存的話,使用者資訊往往會丢失而需要重新登入,使用cookies的話則可以長時間有效比較利于使用者體驗,那session的情況我們不讨論,下面說說使用cookies儲存使用者資訊的情況。

我們首先建立兩個頁面分别是Login.aspx和Main.aspx。Login.aspx用于擷取并儲存使用者資訊到cookies中,Main.aspx則使用者驗證使用者是否有權通路本頁面,我們在本例中設定,登入使用者有權通路,匿名(未登入)使用者,拒絕通路。

首先來看Login.aspx 我們先建立兩個按鈕

Cookies欺騙分析與防護

“擷取登入狀态”按鈕會 把資訊儲存到cookies中,這裡僅儲存UID,然後重定向到Main.aspx

“未擷取登入狀态”按鈕 直接重定向到Main.aspx 進行匿名通路

Login.aspx.cs 程式代碼:

在Main.aspx中進行驗證使用者是否已經登入

 OK,我們來測試一下,點選擷取登入狀态,實際上相當于用admin,123456這個組合來登入。

Cookies欺騙分析與防護

好的,登入成功,我們再來測試下匿名登入,點選未擷取登入狀态

Cookies欺騙分析與防護

事情好像比我們想象的要順利,目前來說我們想要的效果已經都實作了,但是事實上真的是這樣嗎,顯然不是!

我們剛才說過,cookies是在用戶端産生,也就是我們自己的電腦上儲存的

另一方面,Main.aspx這個頁面判斷 你是否能夠通路的依據就是 cookies中的值是多少,如果是1,則認為你目前身份是UID為1的使用者,如果是5,則認為你目前身份是UID為5的使用者。

那麼我們考慮一個事情,如果把我的cookies中的UID修改掉,比如改成35,是不是可以直接繞過登入頁面,就可以以UID為35的使用者身份登入呢?

事實上确實是這樣,這也就是标題中所說的cookies欺騙。由于cookies是用戶端産生我們可以很容易的修改,是以産生安全隐患。

下面就來實際測試一下,首先下載下傳一款軟體 老兵cookies欺騙工具 界面如下圖:

Cookies欺騙分析與防護

在Address中輸入我們項目的通路位址,然後連接配接

Cookies欺騙分析與防護

然後正常操作一遍,分别點選 擷取登入狀态  和  未擷取登入狀态

Cookies欺騙分析與防護
Cookies欺騙分析與防護

發現我們正常操作是正常的判斷,下面重點來了,我們要修改cookies值 點選未擷取登入狀态 一樣可以被授權通路

Cookies欺騙分析與防護
Cookies欺騙分析與防護

登入成功了,那麼我們應該如何避免這樣的問題呢?

正确的做法是,把密碼同時存入cookies(當然實際操作時候需要MD5加密儲存,這裡為了方面示範使用明文儲存),然後在Main.aspx驗證時候,同時驗證UID和密碼是否比對即可。

我們來修改一下代碼:

Login頁面

Main頁面

這樣改動之後,使用者如果再以修改cookies企圖繞過驗證的話,那麼他除了修改UID之外,還必須修改pwd為正确的密碼。

有同學問:那如果他就是把PWD改成正确的密碼了呢?

這位同學...你的密碼都别别人竊取了...那麼再安全的程式代碼也救不了你....

本文中案例源碼及相關工具下載下傳:https://files.cnblogs.com/webconfig/Cookies%E6%AC%BA%E9%AA%97.rar

感謝小夥伴們的熱烈讨論,按照 @老牛吃肉 和其他同類觀點的使用者的建議,我嘗試做了另一方案,做下補充。

使用DES把UID加密放在cookies中,在驗證階段解密驗證。

http://www.cnblogs.com/webconfig/p/3624831.html

本文出自 低調碼農的筆記簿 http://www.cnblogs.com/webconfig/p/3623343.html 轉載請注明出處,如有謬誤不當之處,歡迎指正拍磚,不勝感謝!!