【文章摘要】
隨著軟件規模的日益增大,軟件的安全測試問題也日益突出,使得軟件安全測試也成為軟件開發中一個不可分割的重要部分。基于缺陷模式的軟件測試技術作為高可信軟件的重要保證,可以大大降低軟件的缺陷密度,提高軟件的可信性。
【關鍵詞】
軟件開發;白盒測試;黑盒測試
0 引言
軟件測試是屬于開發階段最后一段時間的主要工作。需要對軟件進行全方位的測試,以確保軟件在上線運營時不會出現影響正常功能使用上的問題。軟件測試時一項非常重要的工作,也是軟件工程中一個重要的環節。軟件測試是在軟件投入運行前,對軟件需求分析,設計規格說明和編碼的最終復審,是軟件質量保證的關鍵步驟。常見的測試方法有黑盒測試與白盒測試。
1 黑盒測試與白盒測試
軟件工程中的測試,必須要用正確的方法,才能提高效率并且行之有效的解決整個開發過程中的問題,并且能為后期的維護提供最大的便利。而我們最經常用到的測試方法就是黑盒測試與白盒測試。
例如我們在做web程序的黑盒子測試時會經常使用一些Fuzzing工具去進行一些壓力的測試,有時候也會進行一些安全性的比如跨站腳本攻擊的測試、SQL注入攻擊的測試、跨域提交漏洞的測試等等注入此類在不知道程序源代碼情況下的Fuzzing技術都屬于黑盒測試的范疇。用黑盒測試發現程序中的錯誤,必須在所有可能的輸入條件和輸出條件中確定測試數據,來檢查程序是否都能產生正確的輸出,但這是不可能的。
工作中大部分的黑盒測試都可以通過編寫代碼來實現全自動化的安全測試,這樣可以解放人的不斷重復性勞動,是一種在做黑盒測試中最常見的方式。
把測試對象看做一個透明的盒子,它允許測試人員利用程序內部的邏輯結構及有關信息,設計或選擇測試用例,對程序所有邏輯路徑進行測試。通過在不同點檢查程序的狀態,確定實際的狀態是否與預期的狀態一致,這就是白盒測試。白盒測試又稱為結構測試或邏輯驅動測試。軟件人員使用白盒測試方法,主要想對程序模塊進行如下的檢查:對程序模塊的所有獨立的執行路徑至少測試一次;對所有的邏輯判定,取“真”與取“假”的兩種情況都至少測試一次;在循環的邊界和運行界限內執行循環體;測試內部數據結構的有效性等。
白盒測試是一種比較容易找出軟件編碼中存在的嚴重問題的方式,他通過通讀源代碼,來發現整個工程中存在的一些邏輯漏洞,或者一些危險函數的利用。有時候也可以通過監測輸入數據與輸出數據的中間流程來發現是否存在輸入未過濾或者輸出不合法等問題。我們以PHP腳本語言問例,當前很多的WEB端軟件工程多是用PHP開發完成,而PHP語言存在的危險函數和危險變量則多達幾十個如果稍有使用不慎,就會造成較為嚴重的安全漏洞。
在PHP的設置中register_globals = Off,PHP在進程啟動時,會根據register_globals的設置,判斷是否將$_GET、$_POST、$_COOKIE、$_ENV、$_SERVER、$REQUEST等數組變量里的內容自動注冊為全局變量。
2 軟件測試在軟件工程中的意義
軟件的測試環節做的好與壞,決定了整個工程的成敗。從軟件測試和軟件可靠性理論入手,對現有的軟件可靠性技術進行研究分析從中發現一些問題就是軟件測試的主要目的。與此同時要總結出現有可靠性模型的特點并分析出現有可靠性模型所存在的局限性與不足,以方便后續開發程序中注意存在的問題。
而對于目前我國軟件產業的現狀,存在多個開源或者非開源項目均曾經爆出過較為嚴重的安全漏洞問題。如下是國內某著名開源軟件工程中存在的一個存儲型跨站腳本攻擊的代碼。
如下函數,解析轉化Iframe標簽(Iframe標簽本身就是個危險標簽,不知道要保留這個功能意義何在)如下
public static function parseIframe($message,$convertStatus = 1){
return preg_replace(\"/\[iframe\]([^\[\<\r\n\\"']+?)\[\/iframe\]/eis\",\"self::createIframe('\\1',\$convertStatus)\",$message,
self::$_cvtimes);
}
看正則/\[iframe\]([^\[\<\r\n\”’]+?)\[\/iframe\]/eis 知道,是匹配形如[iframe]任意非特殊字符[/iframe]。所以可見[iframe]標簽中間的內容是可以任意控制的。匹配后出來的值被放到createIframe中作為第一個參數做了處理,跟進
public static function createIframe($url,$convertStatus){
if($convertStatus){
$html = \"\";
} else {
$html = \"Iframe Close:$url\";
}
return self::_pushCode($html);
}
1)判斷convertStatus,該參數默認為1,生成的$html是將$url的值直接帶入src。所以問題出現了。構造javascript:alert(1)即可觸發該漏洞。我們可以看到生成的HTML代碼為,
當不知情者訪問后即可觸發跨站腳本漏洞
2)當傳遞的convertStatus的值為0時,生成的$html是將$url的值直接帶入href。所以問題同樣出現。構造javascript:alert(2)點擊即可觸發。我們可以看到生成的HTML代碼為,
點擊后仍能觸發跨站腳本漏洞
由于該款產品在國內用戶使用量大概在六百萬以上,所以這個問題剛開始爆出來的時候給很多的個人建站用戶造成了很大的影響,官方也在第二天及緊急發布安全補丁修復這個問題,但是仍然造成數以萬計的使用該程序的站長網站被利用。
3 結語
軟件測試最終的目的是為了發現軟件工程中存在的BUG以及安全漏洞等,從而有效的對整個軟件工程中潛在的風險進行改正。
【參考文獻】
陳汶斌.軟件測試技術基礎[M].北京:清華大學出版社,2008(19)
【作者簡介】
夏天(1982—),男,沈陽人,遼寧德康醫藥有限公司電子商務部經理,同濟大學軟件學院軟件工程碩士研究生。