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