付迪陽
(四川大學計算機學院,成都610065)
互聯(lián)網(wǎng)仍將以指數(shù)增長,并在我們的日常生活中變得越來越重要,但這也導致了Web 應用程序更易受到網(wǎng)絡騙子和黑客的攻擊,輸入驗證在控制提交給系統(tǒng)的用戶輸入中起著關鍵作用,它對系統(tǒng)的魯棒性起著至關重要的作用??蛻舳溯斎腧炞C功能的重要性體現(xiàn)在這三方面,①安全性:客戶端輸入驗證功能的漏洞可能導致系統(tǒng)遭受網(wǎng)絡攻擊[1];②可靠性:客戶端輸入驗證功能的缺陷可能導致用戶無效的輸入引起系統(tǒng)的崩潰;③性能:客戶端輸入驗證功能的錯誤可能導致允許無效輸入請求服務器的方式來降低客戶端與服務器之間不必要的通信來降低性能。因此,在任何與用戶有密集交互的軟件系統(tǒng)中,輸入驗證是必不可少,同時也是一個重要而具有挑戰(zhàn)性的問題。
在軟件程序中,通常要求通過輸入驗證,拒絕不滿足所需業(yè)務規(guī)則所規(guī)定的輸入來執(zhí)行系統(tǒng)約束,以此來保障系統(tǒng)的安全性和可靠性。例如,Web 應用程序注冊新用戶時,都需要要求用戶提交合法的用戶名和密碼,如果用戶名和密碼格式不合法則不予注冊直到符合系統(tǒng)要求為止。在很多信息系統(tǒng)中需要用戶提交相關個人信息,例如郵箱、電話號碼、身份證號碼,等等,這些信息內(nèi)容都是具有特定格式規(guī)范的,如果不滿足約束規(guī)則就不會提交到后臺服務器。正如MSDN 中安全Web 應用程序的設計指南所述[2],適當?shù)妮斎腧炞C是抵御當今應用程序攻擊的最有力措施之一。然而輸入驗證是一個具有挑戰(zhàn)性的問題,輸入驗證的設計和實現(xiàn)都是由應用程序開發(fā)人員進行的,他們要考慮到周全有效的方法來測試輸入驗證,有效防止網(wǎng)絡攻擊和提高程序系統(tǒng)可靠性,解決方案的主要負擔落在Web 應用程序開發(fā)人員身上。
本文對近年來輸入驗證測試包括功能測試和安全測試的相關研究進行了綜述,并分析了這些研究進展的優(yōu)缺點,最后討論了輸入驗證現(xiàn)有研究所面臨的挑戰(zhàn)和未來的發(fā)展趨勢,以期望對其研究能起到一定的幫助和推動作用。
Web 應用程序通常采用圖1 所示的三層體系結(jié)構(gòu),包括客戶端(運行在用戶瀏覽器上)、服務器端(運行在Web 服務器上)和后端數(shù)據(jù)庫(將數(shù)據(jù)持久的存儲在數(shù)據(jù)庫服務器上)。近年來,為了提高效率和可用性,Web 應用程序開始將許多計算任務遷移到客戶端。這通過減少瀏覽器不必要的請求Web 服務器的響應需要,使應用程序更具響應性。現(xiàn)在,許多Web應用程序包括客戶端輸入驗證功能,這些功能檢查用戶輸入,并提示用戶輸入無效,提高用戶體驗的同時也讓無效輸入不需要與Web 服務器進行任何交互。
圖1 Web應用程序三層體系結(jié)構(gòu)
輸入驗證這一概念最早由Hui Liu 等人提出[3],是指大多數(shù)Web 應用程序需要處理來自其外部環(huán)境提交的輸入來改變其外部效果。例如,許多Web 應用程序接收用戶提交的輸入,以更新維護的數(shù)據(jù)庫。它們強制要求從外部環(huán)境提交的任何輸入必須滿足所需的約束,然后才能被接受以引發(fā)外部影響;而提交的違反約束的輸入將被拒絕,并且不會引發(fā)外部影響,這種強制稱為輸入驗證。而Nuo Li[4]和Karel Frajták[5]等人則將起細化為Web 應用程序用戶輸入驗證(WA-UIV),但在軟件測試領域,他們都屬于輸入驗證這一大的集合,是開發(fā)人員開發(fā)可靠應用程序所需解決的問題,只是又根據(jù)平臺不同分為網(wǎng)頁端的Web 應用、服務器端、移動端的Android 和iOS 等,又可以強調(diào)用戶與Web 應用程序之間的交互形式具體細化。本文僅討論Web 應用程序的用戶輸入驗證的相關研究。
當前針對輸入驗證的相關研究主要分為2 個方向,一個側(cè)重對輸入驗證功能的測試,另一個則是側(cè)重對輸入驗證安全的測試。輸入驗證功能測試的方法又分為兩種,一種是基于規(guī)范的方法,一種是基于源代碼分析的方法。而輸入驗證安全測試主要是通過開發(fā)Web 入侵檢測系統(tǒng)來檢測輸入驗證的安全漏洞。本文將重點分析基于源代碼分析的功能測試,這種方式研究更為廣泛,測試結(jié)果更準確,也更適用現(xiàn)代Web 應用程序。
Bazzichi 和Spadafora[6]最早提出輸入驗證測試有關的工作主要集中在自動生成測試編譯器的程序,但不會生成測試用例。而Beizer[7]提出了一種語法測試方法,該方法使用來指定用戶命令,該方法應用圖形覆蓋技術(shù)手動生成測試用例。Marick[8]還提出了一種基于非正式準則的語法測試方法。然而只涵蓋了語法,語法只是輸入驗證的一部分。Hayes 和Offutt 提出[9]用于測試數(shù)據(jù)密集型系統(tǒng)的輸入驗證。他們提出的這兩種輸入驗證測試是一種基于規(guī)范的方法,它自動分析用戶界面規(guī)范以生成測試用例,除了生成有效的測試用例外,還會生成無效的測試用例。由于Web 應用程序中安全性的重要性,Offutt 等人提出了繞行測試[10],這種方式通過繞過客戶端檢查,創(chuàng)建無效的測試用例來測試應用程序的輸入驗證。這兩種方式單獨從規(guī)范生成測試用例,Goodenough 和Gerhart 在他們的軟件測試基礎論文中指出[11]基于規(guī)范的測試方法不能保證完全正確。
Hower[12]的研究工作都集中在Web 應用程序的測試上。他們大多用于Web 應用程序的靜態(tài)驗證和測量,如協(xié)議一致性、壓力測試、鏈接檢查,不直接支持Web 應用程序的功能測試。之后的研究著眼于通過形式化技術(shù)測試Web 應用程序的功能需求。Ricca 和Tonella[13]提出了Web 應用程序的UML 模型,以支持Web 應用程序分析和驅(qū)動測試用例生成。這兩種技術(shù)都從源代碼中提取模型,并將傳統(tǒng)的結(jié)構(gòu)和數(shù)據(jù)流測試應用到Web 應用程序域。Qi 等人[14]提出了一個基于代理的Web 應用建模框架。該方法大大降低了Web 應用程序的復雜性,并在不同的功能層次上進行了數(shù)據(jù)流測試。所提出的方法與這些方法在從源代碼恢復模型和使用結(jié)構(gòu)測試技術(shù)方面相同,但是,它側(cè)重于輸入驗證的建模和測試。
Lucca 和Fasolino[15]將網(wǎng)絡應用測試的策略分為白盒測試、黑盒測試和灰盒測試。白盒測試基于源代碼的抽象結(jié)構(gòu)生成測試輸入,可以基于客戶端源代碼或服務器端源代碼生成測試輸入。Liu 等人[16]分析HTML文檔,為Web 應用程序創(chuàng)建數(shù)據(jù)流模型,并基于數(shù)據(jù)流模型生成測試輸入。Benedikt 等人[17]使用模型檢查器來探索Web 應用程序中用戶可以遵循的Web 站點執(zhí)行路徑。與基于模型的方法相比,這種方法側(cè)重于Web 應用程序的UIV 測試,不需要任何模型。Halfond和Orso[18]使用服務器端源代碼的靜態(tài)分析來提取輸入字段,然后根據(jù)輸入字段生成測試輸入。這種方式由于Web 應用程序的服務器端代碼可以用不同的語言編寫,因此基于靜態(tài)分析自動生成控制流程圖的方法并不能適用所有后端代碼。加上沒有測試支架,無法準確確定服務器端測試的測試結(jié)果。Andrews 等人[19]提出利用字符串分析的方法對目標應用程序動態(tài)生成字符串進行靜態(tài)分析,用于檢查Web 應用程序中格式良好的字符串構(gòu)造。字符串分析構(gòu)造了一個有限狀態(tài)自動機(FSM),它近似于在運行時程序位置為特定字符串變量生成的一組可能的字符串。字符串分析的一個缺點是分析結(jié)果不精確,導致格式良好檢查器中的假陽性。
在2006 年,Liu 和Tan 等人[20-24]提出了一種自動驗證和測試用例生成的方法,用于從程序源代碼中進行輸入驗證。該方法可以應用于處理提交的輸入以提高測試輸入驗證功能測試效率,但也會生成無效的測試用例,影響測試精度。之后,他們改進了他們的方法,通過分析訪問的輸入之間的控制和數(shù)據(jù)依賴以及對程序中的影響,將輸入驗證的一些不變性質(zhì)用于從程序源代碼中自動恢復輸入驗證的方法。這種改進以幫助理解和維護輸入驗證的性質(zhì),從而提高程序員的工作效率和工作質(zhì)量。2007 年,他們又提出了利用控制流程圖的變體表示-驗證流圖的方法來實現(xiàn)自動恢復輸入驗證模型?;谠撃P椭贫藘蓚€覆蓋標準來測試輸入驗證,并用這兩個標準來指導Web 應用程序中輸入驗證的結(jié)構(gòu)測試。但這樣計算復雜度高,輸入驗證的測試準確率也不是很高。2008 年,他們?yōu)榱烁鼫蚀_地測試輸入驗證,提出了一種從代碼中提取路徑劃分和輸入條件的方法,用于測試輸入驗證。這種方法對他們早期工作有了重大改進,理論和方法都有了顯著改進。該方法引入了一個屬性,從代碼中推斷出有效和無效的輸入條件,以及使用恢復的輸入條件來幫助黑盒輸入驗證測試的思想。此外,還對理論中使用的定義進行了簡化和改進,消除了早期方法中的冗余和低效。
Sayma Khan 和Amit Saxena[25]對網(wǎng)絡應用攻擊進行了研究并分析了Web 應用程序中安全威脅的類型,提出了一種改進的網(wǎng)絡應用輸入驗證攻擊檢測方法。Mehrnoush Vaseghipanah[26]開發(fā)了三個用于檢測輸入驗證(IV)攻擊的度量,并為每個攻擊分配了一個秩序,還提出了一種檢測零假陽性率Web 應用程序輸入驗證的方法。這樣在檢測階段獲得更準確的信息,利用檢測水平、準確性和可發(fā)現(xiàn)性三種有效指標來檢測Web應用程序中IV 攻擊的方法。Deepa 等人[27]則開發(fā)了一個入侵檢測系統(tǒng)工具,它通過向攻擊者或惡意用戶提供預警來保護Web 應用程序,從而可能不會進一步利用應用程序查找漏洞,并執(zhí)行ChiSquare 測試,以驗證假設的輸入驗證攻擊。M.Kishore[28]也是提出了入侵檢測系統(tǒng)的方法,利用網(wǎng)絡應用程序發(fā)送的氨基酸編碼形式參數(shù)的成對序列比對檢測模式。使用了一種高效的Hirschberg 算法,這是一種分而治之的方法來發(fā)現(xiàn)針對Web 應用程序的攻擊。然而傳統(tǒng)入侵檢測系統(tǒng)依然有效率不高,誤報率高,時間和空間復雜度更高的問題。
通過對Web 應用程序輸入驗證測試的相關研究,我們發(fā)現(xiàn)仍然存在許多面臨挑戰(zhàn)的問題,下面將闡述這些問題并對未來輸入驗證的研究方向進行了展望。
輸入驗證功能測試基于規(guī)范的方法通過設計違法輸入規(guī)范來構(gòu)造測試用例,嚴重依賴于開發(fā)文檔,然而絕大多數(shù)Web 應用程序是沒有開發(fā)文檔的,讓該方法有了很大的局限性,這種方法會生成很多無效的測試用例,測試效率低下,增加了測試成本,并且不能完全自動化?,F(xiàn)在Web 應用測試基本都是基于代碼的方法,通過從程序源代碼(程序切片、控制流程圖及變體)自動恢復輸入驗證模型的方式。這種方式的復雜度高,測試精度和覆蓋率會依賴代碼的編寫好壞,并且測試用例的結(jié)果無法準確給出具體約束類型,會使得開發(fā)人員自己去理解輸入驗證代碼并重復測試過程。這使得開發(fā)測試周期加大,增加開發(fā)成本?;诎踩珳y試的方法大部分都通過建立Web 應用入侵檢測系統(tǒng)的方式,這種方式誤報率高,計算復雜度高,而且效率很低。這些都是現(xiàn)在輸入驗證測試所面臨的問題。
這幾年,隨著深度學習的快速發(fā)展,自然語言處理被大量用于處理文本數(shù)據(jù),例如情感分析、垃圾郵件識別,等等,并且取得了很好的效果。這讓自然語言處理運用在代碼提供了思路。2020 年,微軟亞洲研究院就通過自然語言處理的技術(shù)通過CodeBERT[29]預訓練模型來實現(xiàn)代碼搜索和代碼生成文檔的任務,將代碼輸入到模型中,并通過訓練的模型運用到下游任務中。未來輸入驗證測試的研究方向會將自然語言處理技術(shù)運用到其中,利用先驗知識將輸入驗證代碼的約束標注識別出來,并分類,利用深度學習去學習特征。這種方式一是可以準確識別出輸入驗證中的漏洞,并具體報告出是欠缺什么約束導致了漏洞。幫助開發(fā)人員理解自己的程序,并且快速準確定位出錯信息,減少了不必要的測試流程,提高了開發(fā)效率。二是這種方式可以嵌入到程序中,開發(fā)人員通過瀏覽器調(diào)試代碼就能可視化的呈現(xiàn)輸入驗證報告信息。從第一時間就能解決輸入驗證漏洞的問題,減少了開發(fā)周期和開發(fā)成本。所以,自然語言處理技術(shù)在未來測試軟件測試以及輸入驗證測試中將會得到大量運用。