WEB自動化測試中針對驗證碼的解決方案(2)

發表于:2011-12-02來源:未知作者:領測軟件測試網采編點擊數: 標簽:Web自動化測試
1.1 Xbm圖片格式及其動態生成 x-xbitmap格式的圖片(以下簡稱為Xbm格式)由于其特殊性,是一種廣泛被用于驗證碼的圖片格式。該圖片格式之所以特殊,在于它

  1.1 Xbm圖片格式及其動態生成

  x-xbitmap格式的圖片(以下簡稱為Xbm格式)由于其特殊性,是一種廣泛被用于驗證碼的圖片格式。該圖片格式之所以特殊,在于它并不跟gif,jpg等圖片格式一樣,是一個二進制圖片格式,而是采用ASCII碼來表示圖形——換句話說,它是一個純文本文件,必須由操作系統對其進行解釋才能顯示出相應的圖片。

  以下是一個xbm文件的內容:

  #define counter_width 32

  #define counter_height 10

  static unsigned char counter_bits[] = { 0x3c, 0x3c, 0x18, 0x3c, 0x66, 0x66, 0x1c, 0x66, 0xc0, 0xc3, 0x18, 0xc3, 0x60, 0xc3, 0x18, 0xc3, 0x1c, 0xc3, 0x18, 0xc3, 0x60, 0xc3, 0x18, 0xc3, 0xc0, 0xc3, 0x18, 0xc3, 0xc0, 0xc3, 0x18, 0xc3, 0x66, 0x66, 0x18, 0x66, 0x38, 0x7e, , 0x7e };

  初看起來,這個文件和圖形并沒有什么關聯,但如果我們新建一個文件,將以上內容復制到文件內并將其保存為test.xbm,然后打開IE窗口,并將該文件直接拖拽到它上面后,我們會驚奇地發現,仿佛變魔術一樣,顯示出來的并不是這個文件的內容,而是一副圖片(見圖2)。

  熟悉C語言的讀者肯定一眼就能看出,上面給出的xbm文件的內容完全就是C代碼中的一個數組定義。沒錯,xbm文件就是采用了一個數組來表示一幅圖片的。

  在上面的文件內容中,#define counter_width 32 定義的是圖片的以象素表示的寬度,一般來說,8個象素的寬度可以用來表示一個字符,因此這里的32可以用來表示本圖片顯示4個字符。

  #define counter_height 10定義了圖片的高度,表示該圖片中每個字符的高度為10象素。而接下來的數組表示的就是圖片顯示內容的16進制代碼了。

  一個16進制的字節可以表示為8位二進制數據,xbm文件用二進制的1表示一個黑色的象素,用二進制的0表示一個白色的象素,因此,一個字節可以表示8個象素。以上面的xbm文件為例,一個32×10象素的圖片就需要40個字節來表示。xbm文件是按行描述的,對上面的例子來說,每4個字節表示了一行。

  因此,如果我們把上述的數組按照4個字節分組進行排列,就會發現字符和數字之間的對應關系。從圖3可以看到,由于一個字節能夠表示8個象素,而一個圖片上的字符寬度也正好是8個象素,因此,對本例來說,按照4個一組的方式排列,很容易得到數組和圖片上顯示字符的對應關系。

  xbm文件可以表示任意的黑白兩色圖形,而且非常易于生成,因此不少的asp論壇/聊天室的登陸驗證碼都是采用這樣的方法在asp中動態生成的。不過由于攻擊者可以利用這種圖形格式的處理過程中的漏洞,制造一個超大的圖片而導致系統資源耗盡的情況,在Windows XP的SP2以后,就取消了對該圖片格式的默認支持,用戶必須通過修改注冊表才能獲得對該圖片格式的支持。

  1.2 其他圖片格式的驗證碼圖形的動態生成

  xbm圖片文件格式簡單,易于生成,但也存在明顯的不足——因為圖片只能為黑白兩色,因此較為容易被自動工具識別。有鑒于此,目前大部分JSP、PHP和ASP.NET網站都利用這些語言本身提供的圖形函數在運行時生成圖形。

  典型的生成圖形的過程包括以下幾個步驟:

  生成圖形對象;

  用背景色填充圖形對象;

  隨機生成字符串,隨機選擇前景顏色,利用程序語言的圖形庫函數以圖形方式向圖形對象中寫入該字符串;

  向圖形對象中增加隨機產生的點或者線;

  輸出圖片文件頭,輸出圖片文件內容。

  下面是一段使用PHP編寫可以用來產生驗證碼的代碼:

//生成驗證碼圖片

Header("Content-type: image/PNG");

session_start();

$auth_num="";

session_register('auth_num');

srand((double)microtime()*1000000);

$auth_num_k = md5(rand(0,9999));

$auth_num = substr($auth_num_k,17,5);

$im = imagecreate(58,28);

$black = ImageColorAllocate($im, 0,0,0);

$white = ImageColorAllocate($im, 255,255,255);

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97