PHP安全:人機(jī)識(shí)別策略
人機(jī)識(shí)別策略是區(qū)分正常用戶(hù)與惡意攻擊者的重要保障機(jī)制。在沒(méi)有人機(jī)識(shí)別的情況下,攻擊者很容易就能對(duì)密碼進(jìn)行暴力破解或者用一個(gè)通用密碼對(duì)用戶(hù)進(jìn)行暴力破解,導(dǎo)致在許多場(chǎng)景中不得不降低用戶(hù)體驗(yàn)。增加人機(jī)識(shí)別策略,可防止惡意攻擊者暴力破解數(shù)據(jù),并減輕服務(wù)器的壓力,例如更好地支持登錄注冊(cè)、密碼找回、支付、轉(zhuǎn)賬、論壇回帖,有效防范強(qiáng)刷頁(yè)面、刷票等。在項(xiàng)目中常用的人機(jī)識(shí)別方式有圖片驗(yàn)證碼、短信驗(yàn)證、語(yǔ)音驗(yàn)證、滑塊驗(yàn)證等。
1、圖片驗(yàn)證碼
圖片驗(yàn)證碼的形態(tài)多樣,主要有數(shù)字、字母、中文組合、計(jì)算題等,驗(yàn)證碼生成算法以及程序?qū)崿F(xiàn)流程上都有可能帶來(lái)問(wèn)題,容易被攻擊者突破。
使用圖片驗(yàn)證碼要注意以下問(wèn)題。
(1)驗(yàn)證碼的字符范圍要盡可能大,盡量使用字母、數(shù)字、漢字、符號(hào)組合的字符集,這種字符集比單純?yōu)閿?shù)字的字符集效果要好。
(2)盡量讓字符進(jìn)行變形、扭曲,或使用干擾性強(qiáng)的圖案,這樣能有效增加驗(yàn)證碼的識(shí)別難度,但這對(duì)人眼識(shí)別是基本無(wú)障礙的。
(3)防止暴力猜解,要對(duì)生成的每一個(gè)驗(yàn)證碼都設(shè)置有效期,驗(yàn)證碼驗(yàn)證失敗一次后一定要設(shè)置為失效,并重新生成新的驗(yàn)證碼。
(4)防止生成的驗(yàn)證碼返回到響應(yīng)中。比如研發(fā)人員忘記注釋掉調(diào)試信息,導(dǎo)致驗(yàn)證碼可能出現(xiàn)在響應(yīng)包中的Cookie、URL、頁(yè)面注釋中,甚至驗(yàn)證碼在展示的時(shí)候直接就是文本方式,這樣就完全失去了使用驗(yàn)證碼的價(jià)值。
(5)推薦使用CAPTCHA項(xiàng)目提供的人機(jī)識(shí)別驗(yàn)證碼。CAPTCHA提供一個(gè)PHP的驗(yàn)證碼生成類(lèi)cool-php-captcha,可以通過(guò)GitHub下載得到。如圖1所示為CAPTCHA樣式示例。
圖1 CAPTCHA樣式示例
2、短信驗(yàn)證碼
短信驗(yàn)證碼的安全使用通常會(huì)遇到以下問(wèn)題。
(1)短信炸彈。如果沒(méi)有進(jìn)行短信發(fā)送頻率限制,容易被利用來(lái)發(fā)送短信炸彈,騷擾用戶(hù)。
(2)經(jīng)濟(jì)損失。限制不嚴(yán)格容易造成短信浪費(fèi)。由于每條短信都需要給運(yùn)營(yíng)商繳納費(fèi)用,因此會(huì)造成沒(méi)必要的經(jīng)濟(jì)損失。
(3)短信內(nèi)容注入。限制不嚴(yán)格容易被注入廣告內(nèi)容發(fā)送給用戶(hù),不但會(huì)對(duì)用戶(hù)產(chǎn)生騷擾,而且會(huì)損失企業(yè)的信譽(yù)。
安全使用短信驗(yàn)證碼的解決方案如下。
(1)使用短信驗(yàn)證碼時(shí),在發(fā)送短信驗(yàn)證碼時(shí)一定要先進(jìn)行人機(jī)校驗(yàn),如校驗(yàn)圖形驗(yàn)證碼。
(2)限制單個(gè)手機(jī)號(hào)某個(gè)時(shí)段內(nèi)最多接收的短信數(shù)量,如根據(jù)業(yè)務(wù)需要每小時(shí)或每天最多發(fā)送五條,每分鐘最多發(fā)送一條。
(3)根據(jù)業(yè)務(wù)需求限制短信發(fā)送的時(shí)間段,如每天早9點(diǎn)以前、晚8點(diǎn)以后禁止發(fā)送短信。
(4)防止用戶(hù)直接或間接地自定義短信內(nèi)容,防止被用于發(fā)送廣告或非法內(nèi)容。
圖2是一個(gè)推薦的通用的短信驗(yàn)證碼發(fā)送校驗(yàn)流程。
圖2 短信發(fā)送檢驗(yàn)流程
3、語(yǔ)音驗(yàn)證碼
通過(guò)播放語(yǔ)音的方式將驗(yàn)證碼告訴用戶(hù),用戶(hù)再將驗(yàn)證碼填寫(xiě)至頁(yè)面中,提交給系統(tǒng)審核。如果用戶(hù)對(duì)圖形形式的驗(yàn)證碼識(shí)別有困難,建議使用語(yǔ)音形式的驗(yàn)證碼。語(yǔ)音認(rèn)證主要有以下三種形式。
(1)在認(rèn)證頁(yè)面進(jìn)行播放。通過(guò)Web頁(yè)面中的播放器將驗(yàn)證碼以語(yǔ)音方式播放出來(lái)。
(2)用戶(hù)主動(dòng)呼叫系統(tǒng)的預(yù)留電話獲取驗(yàn)證碼。這種方式良好地解決了操作終端對(duì)音頻設(shè)備的依賴(lài),且更加私密,安全性高。
(3)由用戶(hù)觸發(fā),系統(tǒng)通過(guò)撥打用戶(hù)的綁定電話接聽(tīng)驗(yàn)證碼。
使用語(yǔ)音驗(yàn)證的需要注意以下事項(xiàng)。
(1)使用語(yǔ)音驗(yàn)證碼時(shí),一定要先進(jìn)行圖形驗(yàn)證碼人機(jī)校驗(yàn)。
(2)對(duì)驗(yàn)證碼要進(jìn)行有效期的設(shè)置,在認(rèn)證失敗后將驗(yàn)證碼進(jìn)行失效處理,防止暴力猜解。
(3)防止頻繁請(qǐng)求,要限制單個(gè)用戶(hù)單個(gè)手機(jī)號(hào)在某個(gè)時(shí)間段的認(rèn)證次數(shù),失敗一定次數(shù)后應(yīng)該拒絕其認(rèn)證請(qǐng)求,避免騷擾用戶(hù)和造成資源浪費(fèi)。
4、其他驗(yàn)證方式
除了常見(jiàn)的圖片、短信、語(yǔ)音驗(yàn)證碼外,根據(jù)自己業(yè)務(wù)情況還可以選擇其他方式的人機(jī)驗(yàn)證,如圖片滑塊拖拽驗(yàn)證、文字按順序選擇在圖片上點(diǎn)擊、好友確認(rèn)等。