Java伺服器端編程安全必讀
來源:互聯網
上載者:User
概述和溢出
一、概述
編寫安全的Internet應用並不是一件輕而易舉事情:只要看看各個專業公告板就可以找到連續不斷的安全性漏洞報告。你如何保證自己的Internet應用不象其他人的應用那樣滿是漏洞?你如何保證自己的名字不會出現在令人難堪的重大安全事故報道中?
如果你使用Java Servlet、JavaServer Pages(JSP)或者EJB,許多難以解決的問題都已經事先解決。當然,漏洞仍有可能出現。下面我們就來看看這些漏洞是什麼,以及為什麼Java程式員不必擔心部分C和Perl程式員必須面對的問題。
C程式員對安全性漏洞應該已經很熟悉,但象OpenBSD之類的工程提供了處理此類問題的安全系統。Java語言處理這類問題的經驗要比C少20年,但另一方面,Java作為一種用戶端程式設計語言誕生,用戶端對安全的要求比伺服器端苛刻得多。它意味著Java的發展有著一個穩固的安全性基礎。
Java原先的定位目標是瀏覽器。然而,瀏覽器本身所帶的Java虛擬機器雖然很不錯,但卻並不完美。Sun的《Chronology of security-related bugs and issues》總結了運行時環境的漏洞發現曆史。我們知道,當Java用作伺服器端程式設計語言時,這些漏洞不可能被用作攻擊手段。但即使Java作為用戶端程式設計語言,重大安全問題的數量也從1996年的6個(其中3個是相當嚴重的問題)降低到2000年的1個。不過,這種安全性的相對提高並不意味著Java作為伺服器端程式設計語言已經絕對安全,它只意味著攻擊者能夠使用的攻擊手段越來越受到限制。那麼,究竟有哪些地方容易受到攻擊,其他程式設計語言又是如何面對類似問題的呢?
二、緩衝溢出
在C程式中,緩衝溢出是最常見的安全隱患。緩衝溢出在使用者輸入超過已指派記憶體空間(專供使用者輸入使用)時出現。緩衝溢出可能成為導致應用被覆蓋的關鍵因素。C程式很容易出現緩衝溢出,但Java程式幾乎不可能出現緩衝溢出。
從輸入資料流讀取輸入資料的C代碼通常如下所示:
char buffer[1000];
int len = read(buffer);
由於緩衝的大小在讀入資料之前確定,系統要檢查為輸入保留的緩衝是否足夠是很困難的。緩衝溢出使得使用者能夠覆蓋程式資料結構的關鍵區段,從而帶來了安全上的隱患。有經驗的攻擊者能夠利用這一點直接把代碼和資料插入到正在啟動並執行程式。
在Java中,我們一般用字串而不是字元數組儲存使用者輸入。與前面C代碼等價的Java代碼如下所示:
String buffer = in.readLine();