驗證碼的三個常見漏洞和修復方法
把驗證碼存儲在Cookie中
一般來說,我們會把驗證碼的值用Session存儲起來,通過對比用戶提交的驗證碼和Session中的驗證碼,就可以知道輸入是否正確。由于Session會占用服務器資源,我曾經(jīng)想過是否可以把驗證碼的值加密后存儲在Cookie中。不過事實證明,這只是異想天開罷了。
假設(shè)驗證碼的值是a,通過sha1加密后得到的值為b = sha1(a),并且把b存儲在Cookie中。而用戶提交的驗證碼值為c,通過判斷sha1(c)是否與b相等,可以知道輸入的驗證碼是否正確。然而,Cookie是受客戶端控制的。如果用戶事先通過肉眼看到驗證碼的值是a,又從Cookie中得知此時的加密值為b,那么,他只要在提交前把Cookie的值修改為b,提交的驗證碼值為a,就可以永遠通過驗證。
沒有進行非空判斷
這種情況可以直接用代碼來說明:
if (Request["captcha"] == Session["captcha"] as string)
{
// 驗證通過,繼續(xù)操作
}
假設(shè)用戶繞過了系統(tǒng)提供的表單直接提交數(shù)據(jù),此時驗證碼還沒生成,Session["captcha"]為空。用戶不提交驗證碼時,Request["captcha"]也為空。于是,驗證通過了。
要解決這個問題,其實只要加個非空判斷就可以了:
if (!String.IsNullOrEmpty(Request["captcha"]) &&
Request["captcha"] == Session["captcha"] as string)
{
// 驗證通過,繼續(xù)操作
}
沒有及時銷毀驗證碼
使用驗證碼要遵循一個原則,在一次比對之后,無論用戶輸入正確與否,都要立刻將驗證碼銷毀。
如果不這樣做,就可以出現(xiàn)以下情況:
假設(shè)用戶輸入錯誤,且驗證碼沒有重新生成,那么他就可以一直嘗試,直到正確為止。雖然機器對圖片的一次性識別率比較低,但是,如果同一張圖片你給它無限次機會的話,它還是可以識別出來的。
假設(shè)用戶輸入成功,且驗證碼沒有銷毀,那么在Session過期之前,他就可以一直用這個驗證碼通過驗證。
相關(guān)文章
Unity?UGUI的PhysicsRaycaster物理射線檢測組件介紹使用
這篇文章主要介紹了Unity?UGUI的PhysicsRaycaster物理射線檢測組件的介紹及使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07深入DropDownList用法的一些學習總結(jié)分析
本篇文章是對DropDownList的用法進行了詳細的分析介紹,需要的朋友參考下2013-06-06C#/VB.NET實現(xiàn)在Word中插入或刪除腳注
腳注,是可以附在文章頁面的最底端的,對某些東西加以說明,印在書頁下端的注文。這篇文章將為您展示如何通過C#/VB.NET代碼,以編程方式在Word中插入或刪除腳注,需要的可以參考一下2023-03-03