安全校驗(yàn)Session驗(yàn)證碼并避免繞開驗(yàn)證碼攻擊
更新時(shí)間:2012年01月08日 18:58:00 作者:
校驗(yàn)驗(yàn)證碼的Session是否為空或者校驗(yàn)用戶輸入的驗(yàn)證碼是否合法,構(gòu)造安全表單的關(guān)鍵就是永遠(yuǎn)不要相信用戶的輸入
已經(jīng)記不得是在哪個(gè)網(wǎng)站上看到的了,一般情況下對(duì)于驗(yàn)證碼的校驗(yàn),大家很容易寫成下面這樣:
<%
If Request.Form("SecurityCode") = Session("SecurityCode") Then
' TODO : Database operations
Else
Response.Write "Security code incorrect!"
End If
%>
驗(yàn)證碼圖片產(chǎn)生Session("SecurityCode")并保存正確的驗(yàn)證碼值,然后獲得用戶提交的驗(yàn)證碼值,然后兩個(gè)一比對(duì)如果一樣則表示驗(yàn)證碼正確,否則驗(yàn)證碼錯(cuò)誤。表面上這樣的算法沒有什么問題,但是對(duì)于一種特殊情況則會(huì)讓驗(yàn)證碼形同虛設(shè)。
首先我們知道,對(duì)于上面的算法有個(gè)核心的地方就是我們要訪問產(chǎn)生驗(yàn)證碼圖片的那個(gè)文件才會(huì)有個(gè)保存驗(yàn)證碼值的Session,然后才能對(duì)用戶的輸入進(jìn)行正確的比對(duì),假如有心人構(gòu)造一個(gè)繞開驗(yàn)證碼圖片文件的Form然后進(jìn)行提交會(huì)得到什么呢?Session("SecurityCode")不存在為空,如果此時(shí)用戶驗(yàn)證碼什么都不輸入,這時(shí)驗(yàn)證碼校驗(yàn)就形同虛設(shè)了。好,這里利用漏洞攻擊的關(guān)鍵就是驗(yàn)證碼的Session,我們很容易就能夠讓服務(wù)器不產(chǎn)生這個(gè)Session從而使這樣的攻擊變成可能。
解決的方法也很容易,校驗(yàn)驗(yàn)證碼的Session是否為空或者校驗(yàn)用戶輸入的驗(yàn)證碼是否合法,構(gòu)造安全表單的關(guān)鍵就是永遠(yuǎn)不要相信用戶的輸入。下面采用校驗(yàn)驗(yàn)證碼Session和用戶輸入的雙保險(xiǎn)辦法解決這個(gè)安全問題:
' str為要校驗(yàn)的驗(yàn)證碼,len為驗(yàn)證碼長(zhǎng)度
Function IsSecurityCodeValid(str, len)
IsSecurityCodeValid = Not CBool( _
IsEmpty(str) Or CStr(str)="" Or Len(str)<len)
End Function
If IsSecurityCodeValid(Request.Form("SecurityCode"), 4) AND _
IsSecurityCodeValid(Session("SecurityCode"), 4) AND _
Request.Form("SecurityCode") = Session("SecurityCode") Then
' TODO : Database operations
Else
Response.Write "Security code incorrect!"
End If
復(fù)制代碼 代碼如下:
<%
If Request.Form("SecurityCode") = Session("SecurityCode") Then
' TODO : Database operations
Else
Response.Write "Security code incorrect!"
End If
%>
驗(yàn)證碼圖片產(chǎn)生Session("SecurityCode")并保存正確的驗(yàn)證碼值,然后獲得用戶提交的驗(yàn)證碼值,然后兩個(gè)一比對(duì)如果一樣則表示驗(yàn)證碼正確,否則驗(yàn)證碼錯(cuò)誤。表面上這樣的算法沒有什么問題,但是對(duì)于一種特殊情況則會(huì)讓驗(yàn)證碼形同虛設(shè)。
首先我們知道,對(duì)于上面的算法有個(gè)核心的地方就是我們要訪問產(chǎn)生驗(yàn)證碼圖片的那個(gè)文件才會(huì)有個(gè)保存驗(yàn)證碼值的Session,然后才能對(duì)用戶的輸入進(jìn)行正確的比對(duì),假如有心人構(gòu)造一個(gè)繞開驗(yàn)證碼圖片文件的Form然后進(jìn)行提交會(huì)得到什么呢?Session("SecurityCode")不存在為空,如果此時(shí)用戶驗(yàn)證碼什么都不輸入,這時(shí)驗(yàn)證碼校驗(yàn)就形同虛設(shè)了。好,這里利用漏洞攻擊的關(guān)鍵就是驗(yàn)證碼的Session,我們很容易就能夠讓服務(wù)器不產(chǎn)生這個(gè)Session從而使這樣的攻擊變成可能。
解決的方法也很容易,校驗(yàn)驗(yàn)證碼的Session是否為空或者校驗(yàn)用戶輸入的驗(yàn)證碼是否合法,構(gòu)造安全表單的關(guān)鍵就是永遠(yuǎn)不要相信用戶的輸入。下面采用校驗(yàn)驗(yàn)證碼Session和用戶輸入的雙保險(xiǎn)辦法解決這個(gè)安全問題:
復(fù)制代碼 代碼如下:
' str為要校驗(yàn)的驗(yàn)證碼,len為驗(yàn)證碼長(zhǎng)度
Function IsSecurityCodeValid(str, len)
IsSecurityCodeValid = Not CBool( _
IsEmpty(str) Or CStr(str)="" Or Len(str)<len)
End Function
If IsSecurityCodeValid(Request.Form("SecurityCode"), 4) AND _
IsSecurityCodeValid(Session("SecurityCode"), 4) AND _
Request.Form("SecurityCode") = Session("SecurityCode") Then
' TODO : Database operations
Else
Response.Write "Security code incorrect!"
End If
相關(guān)文章
詳解Visual Studio使用Git忽略不想上傳到遠(yuǎn)程倉(cāng)庫(kù)的文件
這篇文章主要介紹了Visual Studio使用Git忽略不想上傳到遠(yuǎn)程倉(cāng)庫(kù)的文件,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
手把手教你將Vim改裝成一個(gè)IDE編程環(huán)境(圖文) 吳垠
這篇文章主要介紹了手把手教你將Vim改裝成一個(gè)IDE編程環(huán)境(圖文) 吳垠 ,需要的朋友可以參考下2016-01-01
vscode eslint插件報(bào)錯(cuò)Parsing error: Invalid
這篇文章主要介紹了vscode eslint插件報(bào)錯(cuò)Parsing error: Invalid ecmaVersion問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
搭建一個(gè)開源項(xiàng)目?jī)煞N方式安裝git的詳細(xì)教程
這篇文章主要介紹了搭建一個(gè)開源項(xiàng)目?jī)煞N方式安裝git,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
vscode配置leetcode插件并解決無法登錄問題(圖文詳解)
這篇文章主要介紹了vscode配置leetcode插件并解決無法登錄問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06

