摘要:隨著信息技術(shù)快速發(fā)展信息產(chǎn)品日新月異,計(jì)算機(jī)應(yīng)用在各行各業(yè)不斷深入。隨之產(chǎn)生龐大數(shù)據(jù)的有效性和安全性在網(wǎng)絡(luò)應(yīng)用系統(tǒng)中顯得非常重要。為了使數(shù)據(jù)能夠被合法訪問(wèn)并且不對(duì)數(shù)據(jù)產(chǎn)生破壞性,必須采取有效的防范措施。該文就是從用戶(hù)角度去設(shè)計(jì)和理解用戶(hù)的使用動(dòng)機(jī),選擇有效的數(shù)據(jù)驗(yàn)證方式防止數(shù)據(jù)遭受毀滅性破壞。
關(guān)鍵詞:Web;表單;驗(yàn)證機(jī)制
中圖分類(lèi)號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)34-1987-02
Application Research of the .NET Verify Rule in Web Form Verify
RAN Cong-lin
(Jiujiang University Information Technology Center, Jiujiang 332005, China)
Abstract: With the information technique quickly develops, the information products change with each passing day, computers are used widely in every field. So the usefulness and safety of data seem to be more and more important in the network application systems. Users can visit the data by legal rule, but the useful data are not destroyed by some effective measures. The paper is a typical way to select valid verifications by analyzing users’ motivation for keeping safety data from not being destroyed.
Key words:Web; form; verify rule
1 引言
對(duì)于WEB程序開(kāi)發(fā)人員表單驗(yàn)證選擇在客戶(hù)端還是在服務(wù)器端驗(yàn)證是個(gè)非常麻煩的問(wèn)題。如果進(jìn)行客戶(hù)端JavaScript驗(yàn)證,不僅難以做到美觀統(tǒng)一,而且還可能通過(guò)直接在瀏覽器提交表單來(lái)屏蔽;如果進(jìn)行服務(wù)器端驗(yàn)證,那么把檢驗(yàn)結(jié)果顯示在前臺(tái)頁(yè)面也非常麻煩。
在.NET中,這一問(wèn)題的解決方法得到了改進(jìn),開(kāi)發(fā)者可以更好的選擇,更自動(dòng)化地進(jìn)行服務(wù)器端和客戶(hù)端驗(yàn)證,或者同時(shí)進(jìn)行兩種驗(yàn)證。.NET提供了很多驗(yàn)證控件,使得開(kāi)發(fā)人員不用特別考慮是進(jìn)行客戶(hù)端還是服務(wù)器端驗(yàn)證,也不用考慮如何顯示輸出結(jié)果。
2 .NET中Web表單驗(yàn)證控件的功能和特點(diǎn)及其應(yīng)用。
1) .NET中的Web表單驗(yàn)證器及其功能。
① RequiredFieldValidator檢查用戶(hù)是否輸入或選擇了任何內(nèi)容
② RegularExpressionValidator 根據(jù)規(guī)則表達(dá)式檢查用戶(hù)輸入。該過(guò)程允許進(jìn)行許多種類(lèi)的檢查,可以用于郵政編碼和電話(huà)號(hào)碼等的檢查。
③ CompareValidator 將輸入控件與一個(gè)固定值或另一個(gè)輸入控件進(jìn)行比較。例如,它可以用在口令驗(yàn)證字段中。也可以用來(lái)比較輸入的日期和數(shù)字。
④ RangeValidator 與 CompareValidator 非常相似, 只是它用來(lái)檢查輸入是否在兩個(gè)值或其它輸入控件的值之間。
⑤ CustomValidator 允許用戶(hù)編寫(xiě)自己的代碼以加入到驗(yàn)證框架中。
2)驗(yàn)證控件是執(zhí)行客戶(hù)端驗(yàn)證、服務(wù)器端驗(yàn)證或這兩種驗(yàn)證,具體取決于顯示該頁(yè)面的瀏覽器的功能。驗(yàn)證控件具有下列特點(diǎn)。
① 可以將一個(gè)或多個(gè)驗(yàn)證控件與要驗(yàn)證的各個(gè)控件相關(guān)聯(lián)。
② 提交頁(yè)面窗體時(shí)執(zhí)行驗(yàn)證(頁(yè)面數(shù)據(jù)合法性驗(yàn)證流程圖如圖1)。
③ 可用編程方式指定是否進(jìn)行驗(yàn)證,比如提供一個(gè)取消按鈕,以便用戶(hù)無(wú)須在所有字段中都填充有效數(shù)據(jù)即可退出。
④ 驗(yàn)證控件自動(dòng)檢測(cè)應(yīng)對(duì)客戶(hù)端還是服務(wù)器端執(zhí)行驗(yàn)證。
3 確保表單輸入數(shù)據(jù)的安全靈活選擇驗(yàn)證方式
在各種Web應(yīng)用系統(tǒng)中Web表單是不可或缺的。在Web輸入表單中通常為了避免攻擊對(duì)重要數(shù)據(jù)的蓄意破壞或者保證用戶(hù)輸入信息的有效性,在系統(tǒng)中都應(yīng)該對(duì)用戶(hù)的輸入進(jìn)行檢查和檢驗(yàn),然后再存入數(shù)據(jù)庫(kù)中。那么,對(duì)Web表單數(shù)據(jù)有效性驗(yàn)證是在前臺(tái)還是在后臺(tái)進(jìn)行呢?從以下幾個(gè)方面分析。
1) 理解Web表單驗(yàn)證真正原因。在Web開(kāi)發(fā)中進(jìn)行數(shù)據(jù)有效性驗(yàn)證,通常有兩方面原因:幫助用戶(hù)輸入有效數(shù)據(jù)和保證安全性。
① 就有效數(shù)據(jù)而言,需要保證用戶(hù)輸入是合理的或者真實(shí)的,這其中包括:用戶(hù)輸入了滿(mǎn)足一定要求的用戶(hù)名、密碼和有效郵件地址等,或者包括要求用戶(hù)輸入了真實(shí)的姓名、身份證號(hào)碼等。
② 就安全而言需要保證用戶(hù)不是進(jìn)行惡意攻擊,并且確認(rèn)用戶(hù)輸入信息本身的可信性。
因此無(wú)論從哪一方面來(lái)說(shuō),進(jìn)行數(shù)據(jù)有效性驗(yàn)證都是必要的,而且可能引起問(wèn)題的原因越多,需要進(jìn)行的檢驗(yàn)就越復(fù)雜。
2) 結(jié)合Web表單有效性驗(yàn)證側(cè)重點(diǎn)靈活選擇驗(yàn)證方式。
① 對(duì)于用戶(hù)輸入的有效性,如要求用戶(hù)名不能采用非法字符,密碼滿(mǎn)足一定長(zhǎng)度或者復(fù)雜性,郵件地址滿(mǎn)足特定格式等這類(lèi)檢查要求,在用戶(hù)輸入提交之前就進(jìn)行檢查,完全可以借助.NET提供的大量驗(yàn)證控件在前臺(tái)客戶(hù)端驗(yàn)證。
② 從安全的角度考慮,即使用戶(hù)輸入數(shù)據(jù)滿(mǎn)足有效性要求,通常還應(yīng)該在服務(wù)器端后臺(tái)進(jìn)行進(jìn)一步檢查確認(rèn)。例如針對(duì)SQL注入式攻擊的情況,用戶(hù)有可能繞過(guò)前臺(tái)表單輸入頁(yè)面,直接提交數(shù)據(jù)請(qǐng)求,此時(shí)就有必要進(jìn)行后臺(tái)檢驗(yàn),以保證數(shù)據(jù)足夠的有效性和安全性檢查。相比而言,此次的檢查甚至要比前臺(tái)檢查更進(jìn)一步,并且更加復(fù)雜。
表單在前臺(tái)驗(yàn)證還是在后臺(tái)驗(yàn)證這并不等同于客戶(hù)端驗(yàn)證還是服務(wù)器端驗(yàn)證的問(wèn)題,前臺(tái)或后臺(tái)驗(yàn)證是系統(tǒng)功能的選擇和設(shè)計(jì)原則問(wèn)題,客戶(hù)端驗(yàn)證或服務(wù)器端驗(yàn)證則是一個(gè)具體的技術(shù)實(shí)現(xiàn)方式的選擇問(wèn)題。因此對(duì)于表單數(shù)據(jù)有效性驗(yàn)證,筆者認(rèn)為在.NET中比較妥善的方式是在前臺(tái)和后臺(tái)同時(shí)進(jìn)行驗(yàn)證。
3) 以SQL Server數(shù)據(jù)庫(kù)為例分析由Web表單產(chǎn)生“SQL注入式攻擊”的應(yīng)對(duì)策略。
在數(shù)據(jù)庫(kù)網(wǎng)絡(luò)應(yīng)用系統(tǒng)中采用SQL Server數(shù)據(jù)庫(kù),容易產(chǎn)生一種常見(jiàn)的安全性錯(cuò)誤,即SQL漏洞注入式錯(cuò)誤,由此可能引發(fā)利用這種錯(cuò)誤進(jìn)行所謂的“SQL注入式攻擊”。通過(guò)筆者多年在Web表單開(kāi)發(fā)中遇到“SQL注入式攻擊”問(wèn)題簡(jiǎn)單并分析其應(yīng)對(duì)策略。
SQL注入式攻擊是攻擊者把SQL命令插入到Web表單的輸入域或者頁(yè)面請(qǐng)求的查詢(xún)字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令。在某些表單中,用戶(hù)輸入的內(nèi)容直接用來(lái)構(gòu)造或者影響動(dòng)態(tài)SQL命令,或者為存儲(chǔ)過(guò)程的輸入?yún)?shù),這類(lèi)表單特別容易受到SQL注入式攻擊。
常見(jiàn)的SQL注入式的基本過(guò)程有:
① 某個(gè).NET Web應(yīng)用有一個(gè)登錄頁(yè)面,這個(gè)登錄頁(yè)面控制著用戶(hù)是否有權(quán)訪問(wèn)該應(yīng)用程序,它要求用戶(hù)輸入一個(gè)合法帳號(hào)和密碼。
② 登錄頁(yè)面中輸入的內(nèi)容用來(lái)構(gòu)造動(dòng)態(tài)的SQL命令,或者直接用作存儲(chǔ)過(guò)程的參數(shù)。
③ 攻擊者在用戶(hù)名字和密碼框輸入’’’或’1’=’1’之類(lèi)的內(nèi)容。
④ 用戶(hù)輸入的內(nèi)容提交給服務(wù)器之后,服務(wù)器運(yùn)行上面的.NET代碼構(gòu)造出查詢(xún)用戶(hù)的SQL命令,但由于攻擊者輸入的內(nèi)容非常特殊,所以最后得到的SQL命令變成:select * from user where login =’’ or ‘1’=’1’ and password = ‘’ or ‘1’=’1’。
⑤ 服務(wù)器執(zhí)行查詢(xún)或存儲(chǔ)過(guò)程,將用戶(hù)輸入的身份信息和服務(wù)器中保存的身份信息進(jìn)行對(duì)比。
⑥ 由于SQL命令實(shí)際上已被注入式攻擊修改,已經(jīng)不能真正驗(yàn)證用戶(hù)身份,所以系統(tǒng)會(huì)錯(cuò)誤地授權(quán)給攻擊者。
如果用戶(hù)的帳號(hào)具有管理員或者其他比較高級(jí)的權(quán)限,攻擊者就可能對(duì)數(shù)據(jù)庫(kù)表執(zhí)行各種想要做的操作,包括添加、刪除或更新數(shù)據(jù),甚至可能直接刪除表。
4) 根據(jù)在Web應(yīng)用系統(tǒng)中復(fù)雜的SQL注入式攻擊的基本過(guò)程和原理,如何有效避免錯(cuò)誤應(yīng)對(duì)SQL注入式攻擊,筆者認(rèn)為要堅(jiān)持下面三個(gè)基本原則。
① 對(duì)IIS的執(zhí)行權(quán)限謹(jǐn)慎管理,除非特別必要,一般不要提供執(zhí)行權(quán)限。
② 謹(jǐn)慎管理數(shù)據(jù)庫(kù)用戶(hù)的訪問(wèn)權(quán)限,通常public權(quán)限就足夠了,sa級(jí)別權(quán)限不要提供。
③ Web開(kāi)發(fā)程序代碼中盡可能多地增加對(duì)客戶(hù)提交數(shù)據(jù)的檢測(cè)。
4 防范SQL注入漏洞的具體方法
根據(jù)以上原則和筆者在Web編程開(kāi)發(fā)過(guò)程積累的經(jīng)驗(yàn)提供以下防范SQL注入漏洞的具體方法:
1) 檢測(cè)用戶(hù)輸入為空時(shí)立即重定向。
2) 強(qiáng)制檢測(cè)用戶(hù)提交信息路徑,禁止從非指定頁(yè)面提交數(shù)據(jù)。
3)對(duì)用戶(hù)通過(guò)網(wǎng)址提交的變量進(jìn)行檢查。例如,一旦發(fā)現(xiàn)客戶(hù)提交的參數(shù)中有insert、select、delete、from等關(guān)鍵字符時(shí)要立即對(duì)其進(jìn)行過(guò)濾操作轉(zhuǎn)向出錯(cuò)頁(yè)面或者給出警告信息。
4) 對(duì)所有頁(yè)面錯(cuò)誤,統(tǒng)一給出一種錯(cuò)誤提示信息。
5) 用戶(hù)密碼加密,例如采用類(lèi)似MD5沒(méi)有反向算法且不能解密的加密算法。
6) 對(duì)核心頁(yè)面程序代碼實(shí)行動(dòng)態(tài)加密管理。
7) 查看系統(tǒng)日志實(shí)時(shí)監(jiān)測(cè)系統(tǒng)運(yùn)行狀況,定時(shí)對(duì)數(shù)據(jù)進(jìn)行異地備份。
5 結(jié)束語(yǔ)
通過(guò)項(xiàng)目開(kāi)發(fā)的實(shí)際應(yīng)用表明,做表單驗(yàn)證時(shí)服務(wù)器程序不能假定客戶(hù)端程序是正確的而不加檢測(cè),這樣如果客戶(hù)端關(guān)閉JavaScript就可能造成出錯(cuò),而如果只做服務(wù)器端檢測(cè),那么需要提交到服務(wù)器端再返回,效率就會(huì)大打折扣,并且對(duì)于用戶(hù)極不方便,所以只能客戶(hù)端和服務(wù)器端作兩次驗(yàn)證的機(jī)制,這樣就能夠很大程度確保數(shù)據(jù)的安全。
參考文獻(xiàn):
[1] 丁昊凱.ASP.NET網(wǎng)站開(kāi)發(fā)典型模塊與實(shí)例精講[M].北京:電子工業(yè)出版社,2006.
[2] Payne C.ASP.NET從入門(mén)到精通[M].趙斌,譯.北京:人民郵電出版社,2002.
[3] 彭木根.數(shù)據(jù)倉(cāng)庫(kù)技術(shù)與實(shí)現(xiàn)[M].北京:電子工業(yè)出版社,2002.