公號(hào):軟測(cè)小生 ruancexiaosheng
現(xiàn)在的很多網(wǎng)站在登陸時(shí)都需要驗(yàn)證碼蜜托,倘若遇到自動(dòng)化測(cè)試時(shí),怎么解決呢敢订?
驗(yàn)證碼大概有以下幾種:
有的是圖片驗(yàn)證碼:圖片上顯示數(shù)字响巢,漢字,英文數(shù)字以及算術(shù)題等重抖;
有短信/郵箱發(fā)送驗(yàn)證碼:一般為四位/六位/八位數(shù)字驗(yàn)證碼露氮;
有語(yǔ)音驗(yàn)證碼:電話接聽(tīng)語(yǔ)音播報(bào)此次驗(yàn)證碼;
首先來(lái)說(shuō)說(shuō)我所遇到的項(xiàng)目經(jīng)驗(yàn):
項(xiàng)目有短信和郵箱兩種方式發(fā)送8位的數(shù)字驗(yàn)證碼钟沛。
短信驗(yàn)證碼只做了手工測(cè)試畔规,當(dāng)時(shí)想的是短信驗(yàn)證碼需要一臺(tái)手機(jī),并且能夠發(fā)送驗(yàn)證碼恨统,由于當(dāng)時(shí)沒(méi)有做移動(dòng)端的任何測(cè)試叁扫,考慮到成本問(wèn)題只能在自動(dòng)化測(cè)試是放棄這種登錄驗(yàn)證方式三妈,只保證功能在手工測(cè)試時(shí)正常通過(guò);
然后在登陸時(shí)選擇郵件發(fā)送驗(yàn)證碼莫绣,如何取得驗(yàn)證碼呢畴蒲?
首先申請(qǐng)了一個(gè)公用郵箱,專門用來(lái)接收驗(yàn)證碼对室,然后寫一個(gè)自動(dòng)登錄腳本登陸郵箱(好在郵箱登陸時(shí)不用驗(yàn)證碼)模燥,解析郵件內(nèi)容,獲取驗(yàn)證碼掩宜。
后來(lái)我不在這個(gè)項(xiàng)目了蔫骂,聽(tīng)同事說(shuō)是不再使用郵件和短信這種方式來(lái)驗(yàn)證了(是在確保了發(fā)送驗(yàn)證碼這一功能上線正常之后才使用的),直接通過(guò)托管的日志文件管理工具Splunk去獲取驗(yàn)證碼牺汤,相當(dāng)于繞過(guò)發(fā)送到短信/郵箱纠吴。
為了更好地解決問(wèn)題,首先來(lái)了解一下驗(yàn)證碼的機(jī)制:
為什么登陸時(shí)需要驗(yàn)證碼慧瘤?
沒(méi)有驗(yàn)證碼登陸戴已,黑客會(huì)更加容易破解你的賬號(hào),通過(guò)組合碼刷機(jī)等黑客技術(shù)來(lái)破取你的密碼锅减,有了驗(yàn)證碼相當(dāng)于加了一層很厚的屏障糖儡,安全系數(shù)很高。
驗(yàn)證碼是一種區(qū)分用戶是計(jì)算機(jī)和人的公共全自動(dòng)程序怔匣。
驗(yàn)證碼作用:可以防止惡意破解密碼握联、刷票、論壇灌水每瞒,有效防止某個(gè)黑客對(duì)某一個(gè)特定注冊(cè)用戶用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試金闽,實(shí)際上是用驗(yàn)證碼是現(xiàn)在很多網(wǎng)站通行的方式(比如招商銀行的網(wǎng)上個(gè)人銀行,百度社區(qū))剿骨,利用比較簡(jiǎn)易的方式實(shí)現(xiàn)了這個(gè)功能代芜,同時(shí)驗(yàn)證碼的樣子也會(huì)盡量千奇百怪,讓機(jī)器不能夠識(shí)別浓利。
驗(yàn)證碼一般存儲(chǔ)在哪里挤庇?(如何測(cè)試驗(yàn)證碼)
驗(yàn)證碼服務(wù)端存儲(chǔ)設(shè)計(jì):服務(wù)器生成驗(yàn)證碼后,存儲(chǔ)起來(lái)(緩存或者持久化)贷掖,以方便用戶提交驗(yàn)證碼時(shí)進(jìn)行驗(yàn)證嫡秕。
1、存儲(chǔ)在本進(jìn)程內(nèi)存中:服務(wù)器生成驗(yàn)證碼后苹威,即將驗(yàn)證碼存儲(chǔ)在服務(wù)器中昆咽,一般以session方式進(jìn)行存儲(chǔ)。
優(yōu)點(diǎn):性能好
缺點(diǎn):擴(kuò)展性查、占用服務(wù)器內(nèi)存
**如何測(cè)試:其他進(jìn)程是訪問(wèn)不到服務(wù)進(jìn)程的掷酗,只能在開(kāi)發(fā)時(shí)服務(wù)進(jìn)程內(nèi)增加驗(yàn)證碼查詢接口调违,以方便驗(yàn)證,上線時(shí)汇在,將此接口移除或禁用翰萨。 **
2脏答、存儲(chǔ)在文件中
3糕殉、存儲(chǔ)在數(shù)據(jù)庫(kù)中
優(yōu)點(diǎn):可供多個(gè)服務(wù)進(jìn)程查詢
缺點(diǎn):性能稍差,占用數(shù)據(jù)庫(kù)服務(wù)器性能
如何測(cè)試:(1)進(jìn)程內(nèi)提供接口殖告,方便查詢(2)直接進(jìn)行數(shù)據(jù)庫(kù)查詢
4阿蝶、存儲(chǔ)在redis等nosql數(shù)據(jù)庫(kù)中
優(yōu)點(diǎn):性能高、一般nosql數(shù)據(jù)庫(kù)提供集群功能黄绩,可靠性高
如何測(cè)試:調(diào)用nosql的客戶端驅(qū)動(dòng)羡洁,進(jìn)行查詢
驗(yàn)證碼的機(jī)制
前端:前端網(wǎng)頁(yè)通過(guò)一個(gè)URL來(lái)對(duì)后端進(jìn)行請(qǐng)求,通常會(huì)給這個(gè)請(qǐng)求帶上一個(gè)時(shí)間戳或者是隨機(jī)數(shù)爽丹。
后端:接收到前端的request筑煮,后端會(huì)先生成一個(gè)隨機(jī)數(shù)(通常4位),然后把該隨機(jī)數(shù)存到與該客戶端的session里面粤蝎。隨后把該隨機(jī)數(shù)圖像處理一下真仲,變得讓機(jī)器難以識(shí)別。隨后把圖片(jpg或者png)直接發(fā)送到前端(response)初澎。
然后后端驗(yàn)證用戶輸入圖片上的驗(yàn)證碼/或短信郵箱中的驗(yàn)證碼與后臺(tái)生成的驗(yàn)證碼是否一致秸应,一致即可登錄。
PS:前端想獲得隨機(jī)數(shù)的值碑宴,如果是模板型網(wǎng)頁(yè)(如jsp软啼、php、asp等)可以在服務(wù)器端訪問(wèn)session來(lái)獲取值延柠。而如果是RESTfulAPI型的祸挪,就只能通過(guò)ajax對(duì)服務(wù)器進(jìn)行請(qǐng)求來(lái)獲得值了。
自動(dòng)化測(cè)試遇到驗(yàn)證碼的啟發(fā):自動(dòng)化測(cè)試時(shí)如何應(yīng)對(duì)驗(yàn)證碼
從上述的驗(yàn)證碼測(cè)試方案中可以得出:在做自動(dòng)化登陸的同時(shí)贞间,可以采取同樣四種的方式來(lái)取得驗(yàn)證碼匕积,繞過(guò)短信郵件圖片驗(yàn)證碼的識(shí)別讀取過(guò)程(當(dāng)然的確保驗(yàn)證碼的功能模塊實(shí)現(xiàn)已經(jīng)正常)。
當(dāng)然在自動(dòng)化測(cè)試登陸過(guò)程中榜跌,還有幾種應(yīng)對(duì)方案:
其一:去掉驗(yàn)證碼(測(cè)試環(huán)境)
這是最簡(jiǎn)單的方法闪唆,對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),只是把驗(yàn)證碼的相關(guān)代碼注釋掉即可钓葫,線上環(huán)境取消注釋驗(yàn)證碼模塊悄蕾。如果是在測(cè)試環(huán)境,這樣做可省去了測(cè)試人員不少麻煩,線上環(huán)境若是去掉驗(yàn)證碼的話一般是不可取的帆调,線上環(huán)境可選擇下面的方案二奠骄。
其二:設(shè)置萬(wàn)能驗(yàn)證碼(應(yīng)該是最佳選擇,但是需要開(kāi)發(fā)人員的支持)
去掉驗(yàn)證碼的主要是安全問(wèn)題番刊,為了應(yīng)對(duì)在線系統(tǒng)的安全性威脅含鳞,可以在修改程序時(shí)不取消驗(yàn)證碼,而是程序中留一個(gè)“后門”——設(shè)置一個(gè)“萬(wàn)能驗(yàn)證碼” 芹务,只要用戶輸入這個(gè)“萬(wàn)能驗(yàn)證碼” 蝉绷,程序就認(rèn)為驗(yàn)證通過(guò),否則按照原先的驗(yàn)證方式進(jìn)行驗(yàn)證枣抱。
其三:驗(yàn)證碼識(shí)別技術(shù)
例如可以通過(guò) Python-tesseract等技術(shù)來(lái)識(shí)別圖片驗(yàn)證碼熔吗,Python-tesseract 是光學(xué)字符識(shí)別 Tesseract OCR 引擎的 Python 封裝類。能夠讀取任何常規(guī)的圖片文件(JPG, GIF ,PNG , TIFF 等)佳晶。不過(guò)桅狠,目前市面上的驗(yàn)證碼形式繁多,目前任何一種驗(yàn)證碼識(shí)別技術(shù)轿秧,識(shí)別率都不是 100% 中跌。
目前有很多專門做驗(yàn)證碼識(shí)別技術(shù)的,畢竟術(shù)業(yè)有專攻菇篡,也是不錯(cuò)之選漩符,畢竟自己造輪子不大可取。
其四:記錄 cookie
通過(guò)向?yàn)g覽器中添加 cookie 可以繞過(guò)登錄的驗(yàn)證碼逸贾,這是比較有意思的一種解決方案陨仅。我們可以在用戶登錄之前,手動(dòng)登陸铝侵,獲取cookie灼伤,通過(guò) add_cookie()方法將用戶名密碼寫入瀏覽器 cookie ,再次訪問(wèn)系統(tǒng)登錄鏈接將自動(dòng)登錄咪鲜。
但是有的Cookie有一個(gè)過(guò)期時(shí)間狐赡,一旦再次運(yùn)行代碼時(shí)就需要重新獲取cookie,也造成一些麻煩疟丙。
栗子:Selenium+python 繞過(guò)驗(yàn)證碼登陸百度