{
od[j] = t[j*4+i];
}
lr_output_message("%d", getDigital(od));
}
其他通過服務器代碼繪圖方式實現的識別碼識別相對麻煩一些,但原理上都差不多,無非是將獲取到的圖片進行分析,通過識別方法判斷其對應的符號。
<!--[if !supportLists]-->1.2 <!--[endif]-->服務端插入法
如果可以控制和修改服務端代碼,就可以使用服務端插入法。該方法在服務端提供一個可被客戶端使用的接口,只要客戶端傳遞過來自己的SessionID,該接口就返回此時正確的Session,這種方法就可以很容易地讓自動測試工具直接獲取到正確的應該提交的驗證碼內容。從測試的角度來說,這種方法就等于是在系統上增加了一個測試接口,從而提高了系統的可測試性。
服務端插入法的實現并不復雜,在任何一個平臺上都能很容易實現,在此就不再贅述了。服務端插入法可以針對任何類型的應用使用,但這種方法也有明顯的不足:
<!--[if !supportLists]-->1、 <!--[endif]-->如果是已經上線的應用,網站不太可能會允許保留一個這樣的接口,因此,該方法一般用于還未上線的WEB系統,如果要在已上線的WEB系統上使用該方法,則必須通過管理上的方法提高該方面的安全性;
<!--[if !supportLists]-->2、 <!--[endif]-->采用這種方法,在性能測試時,由于該方法需要額外請求一次才能獲得實際的驗證碼,相對于實際的用戶操作來說,訪問帶有驗證碼頁面的請求會多一次,因此在獲得的測試結果上會有些許的差異。
<!--[if !supportLists]-->1.3 <!--[endif]-->解決自動測試中驗證碼問題的非技術方法
其實,測試并不只是單單的技術問題,除了上面給出的識別法和服務端插入法,其實,通過非技術的方式也能讓自動化測試在具有驗證碼的系統上成功應用。當然,這些非技術方法應用的前提是,測試團隊必須具有足夠的能力和機會影響系統的實現。如果完全沒有方法接觸到服務端代碼或是完全不能修改服務端代碼,以下的方法就都不能應用了。
下面,讓我們跳出技術的范圍,換個角度來看看如何解決驗證碼的問題:
<!--[if !supportLists]-->1、 <!--[endif]-->屏蔽法
屏蔽法是最容易想到的一種方法,方法的核心就是:在被測系統中暫時屏蔽驗證功能。這種方法最容易實現,對測試結果也不會有太大的影響(當然,這種方式去掉了“驗證驗證碼”這個環節,如果該環節本身存在功能上的問題,或是本身就是性能的瓶頸,那就一定會對測試結果造成影響了)。但這種方法也有一個問題:如果被測系統是一個實際已上線的系統,屏蔽驗證功能會對已經在運行的業務造成非常大的安全性的風險,因此,對于已上線的系統來說,用這種方式就不合適了。
<!--[if !supportLists]-->2、 <!--[endif]-->后門法
后門法不屏蔽驗證碼,但在其中留一個后門,在代碼中設定一個所謂的“萬能驗證碼”,只要用戶輸入這個“萬能驗證碼”,就能通過驗證,否則,還是按照正常的驗證方式進行驗證。這種方式仍然存在安全性的問題,但由于我們可以通過管理手段將“萬能驗證碼”控制在一個小的范圍內,而且只在測試期間保留這個小小的后門,相對第一種方法來說,在安全性方面有了較大的提高。
<!--[if !supportLists]-->1.4 <!--[endif]-->各種方法的比較
本文提供了多種用于解決具有驗證碼的WEB系統在自動測試時遇到問題的方法,這些方法既包含技術性的方法,也包含非技術性的方法。但由于每種方法的出發點不同,因此這些方法也就具有各自不同的優缺點和適用場合。本節我們對本文提到的各種方法進行比較,分別給出其優缺點和適用的場合。
|
技術性方法 |
非技術性方法 |
||
|
識別法 |
服務端插入法 |
屏蔽法 |
后門法 |
優點
|
不需要修改代碼,也不需要在代碼中增加額外的接口和后門,在服務端代碼不可接觸到的情況下,是唯一的選擇 |
理論上來說可以解決任何驗證碼的問題,而且不需要修改已有的服務端代碼 |
簡單修改現有代碼就能讓自動測試順利進行,開銷小 |
實現方式不復雜,對現有代碼改動小,安全性相對有保證 |
缺點
|
存在技術限制,只能對相對簡單的驗證碼圖片進行分析識別,對復雜的圖片無法進行識別 |
存在一定的安全隱患,如果被攻擊者獲知測試接口,驗證碼就會失去作用 |
存在很大的安全問題,對于未上線應用還可應用,對于已上線的實際應用,該方法不可行;況且,由于該方法需要對代碼修改的內容太多,導致發布時可能發生某些驗證碼被不正確屏蔽的情況 |
如果被攻擊者探測得到萬能驗證碼,則驗證碼會失去作用 |
適用場合
|
<!--[if !supportLists]-->1、 <!--[endif]-->服務端代碼不可接觸到或是不可進行任何修改 <!--[if !supportLists]-->2、 <!--[endif]-->驗證碼采用xbm等較簡單的方式實現 |
未上線系統,或是在測試條件下安全性要求不是特別高的系統; |
開發階段,未實際上線的系統 |
可在實際應用系統上應用 |
應用建議
|
純粹的客戶端識別解決方案成本較高,建議主要采用服務端方式實現 |
在管理上需要增加對測試接口的管理,系統在發布時需要保證去掉測試接口 |
在發布管理時,一定要有合理的方案保證發布時所有被屏蔽的驗證碼能夠得到恢復 |
為了保證上線系統的安全,該方法一般需要結合密碼管理方法使用,通過定期更換萬能驗證碼、控制其知曉范圍等手段保證安全 |