大家所熱切期盼的XP的SP2補丁正式版本已經放出,根據官方消息,中文版本的SP2也即將在隨后的8月21日左右放出。
在SP2補丁包里,除了對bug的修復和功能的加強外,也對安全控制做了相應修改,指定了更嚴格的默認安全策略,以保證用戶安全。
在更改后的安全策略中,因為基于安全因素的考慮,默認去掉了對 image/x-xbitmap 圖片格式的支持(該圖片的后綴名為Xbm)的支持。去掉支持一種危險的圖片格式本身是無可厚非的,那么,為什么我要專門提到這個圖片格式,它有什么特別之處,一般運用在什么場合呢? 說x-xbitmap格式的圖片(以下簡稱為Xbm格式)的圖片特殊,就在于它并不跟gif,jpg等圖片格式一樣,是一個真正的純2進制圖片格式,而是ascii碼文件--換句話說,它是一個純文本文件,在Windows系統(tǒng)下,系統(tǒng)瀏覽器將它翻譯成圖片來進行顯示。
解析Xbm圖形格式
Ok,讓我們先來看看這種特殊圖片的格式的例子:
新建一個文本文件,將以下內容復制過去
#define counter_width 48
#define counter_height 9
static unsigned charcounter_bits[]={ff,3c,7c,3c,70,3c,fe,7c,fe,7c,78,7c,ee,ee,ee,ee,7c,ee,e0,ee,60,ee,74,ee,70,fe,30,
fe,70,fe,38,ec,e0,ec,70,ec,1c,e0,ee,e0,70,e0,fe,7e,fe,7e,70,7e,fe,3c,7c,3c,70,3c}
然后,將此文本文件保存為名字為 test.Xbm的文件。
接下來,讓我們看看如果在ie中打開它,會出現什么情形??(新開一個ie,然后將test.Xbm直接拖拽到它上面),哈,出現了如下圖一樣的情景,在瀏覽器中出來的,已經不是我們的文本,而是一個黑白的圖片了!
讓我們看看上面那代碼中,每一行的意義:
#define counter_width 48 這里定義了圖片的寬度,一般都設置為8的整數倍,因為我們想顯示的是6個數字,所以就設置成了8*6=48的寬度
#define counter_height 9 這里設置了圖片的高度,可以任意設置,但是注意,這里的數字直接決定了下面的數組中,是用幾組數來表示一個顯示出的數字
static unsigned char counter_bits[]={7c,3c,7c,3c,70,3c,fe,7c,fe,7c,78,7c,ee,ee,ee,ee,7c,ee,e0,ee,60,ee,74,ee,70,fe,30,
fe,70,fe,38,ec,e0,ec,70,ec,1c,e0,ee,e0,70,e0,fe,7e,fe,7e,70,7e,fe,3c,7c,3c,70,3c}
在這里,是圖片用來顯示內容的十六進制的代碼,在這里,是9*6=54個數字來表示,值得一提的是,由于在圖片顯示中,是顯示完了一行后,再顯示第2行,直到最后一行,因此更為準確的描述是6*9顯示,每6個數表示一行(因為我們顯示了6個數字),一共9行(我們的定義中,是采用的高度為9的數組)
正如static unsigned char英文意思為靜態(tài)的,無符號的,燒焦的。它只能用來顯示黑白兩種顏色。二進制中的1將來用顯示為黑色,0為白色。
因此,上面的7c、3c這樣的數字,就是一個256位的2進制,其中的1表示黑色,0表示白色,由此繪制出每個數字的圖形。
由于Xbm文件的性質決定,它只能顯示黑/白兩種顏色,而且以數組的方式來表現每個要顯示的圖形,注定了不能用它生成太復雜的圖案。那么,這樣的圖片格式到底有什么用呢??當然有的,不少asp論壇/聊天室的登陸驗證碼,就是用這樣的方法在asp中動態(tài)生成的。
SP2為什么會禁用Xbm圖形格式
那么,象這樣一個被廣泛采用的生成驗證代碼的技術,為什么微軟在XP的SP2升級包中又要禁止掉它呢??這就需要從Xbm的漏洞談起了。
Microsoft Internet EXPlorer和Outlook EXPress在處理WEB頁,HTML郵件,EMAIL附件中畸形Xbm圖象文件會導致崩潰,問題存在于對Xbm文件中的內容缺少檢查,MSIE按照圖象規(guī)定的長度和寬度分配內存,攻擊者可以提高超大的長度和寬度數值導致系統(tǒng)消耗內存或者訪問沖突。
換句話說,如果構造一個長寬的尺寸特別大的Xbm文件,很容易導致Windows的內存耗盡,導致程序無響應或者死機。本身來說,這不算一個特別嚴重的漏洞,因為根據安全公告,無法造成溢出,不會存在太大的權限漏洞。但是由于XP的SP2強調安全性,因此將Xbm功能禁用了。從這點上可以看出,SP2對于安全的確比較重視,將有漏洞的功能基本上都補上或禁用了,作為網絡管理員,我對微軟的做法表示支持,因為操作系統(tǒng)默認設置的不安全,常常是造成非專業(yè)用戶被攻擊的首要因素。
解禁方法:
由此看出,以后我們訪問某些采用生成Xbm作為驗證代碼的站點的時候,就相當不方便了,如果有必要,可以通過簡單的操作注冊表恢復我們需要的功能。
打開注冊表,然后進到鍵值[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet EXPlorer\Security]
將blockXbm的值改為00000000(dword,雙字節(jié)),沒有的話新建立一個就可以了。
之后重新啟動機器,則Xbm格式的圖片就可以看到了。
從SP2禁止Xbm的趨勢看出,微軟打算似乎已經開始打算放棄對Xbm格式的支持了。那么,作為程序編寫者,有必要未雨綢繆,尋找其他生成驗證碼的途徑。在php中,可以通過調用gd庫等方式生成jpg/gif等圖形格式的注冊驗證碼,那么在asp中有其他的辦法么?
事實上圖片驗證密碼的關鍵是--不能在客戶端留下圖片的真實url,或可對應反推源地址的信息,因此asp可以采用以下2種方式實現支持SP2的圖形驗證碼。
如果是購買的虛擬主機,那么可以采用將jpg/gif圖片放到數據庫,然后用session傳值的方式,最后利用asp直接從數據庫中輸出圖片,這方法的好處是不需要特別設置服務器端,壞處則是每次生成驗證圖片時都會需要與數據庫連接,增加了開銷。
如果是有管理員控制權限的用戶,可以考慮采用第三方組件來實現。天緣個人推薦 ASP圖象組件shotgraph ,它的免費版本對生成的圖形有一定限制,不過已經足夠用來制作驗證碼了。