輸入驗(yàn)證可避免一半以上的應(yīng)用安全攻擊
俗話說病從口入,可以說絕大多數(shù)的應(yīng)用安全問題的源頭都是由輸入的入口引發(fā),但是輸入入口安全檢測不能解決所有的潛在安全問題,原因很簡單,那就是接收輸入的數(shù)據(jù)時,接收者并不知道此數(shù)據(jù)用來做什么,涉及的業(yè)務(wù)邏輯是什么,所以無法在輸入入口處進(jìn)行完備而妥善的安全檢測與處理。但是,還是要強(qiáng)調(diào)一下這個“但是”,我們不能因?yàn)榇颂幉荒芙鉀Q所有的問題而放棄它忽略它,本文將告訴你:做好完善合理的“輸入驗(yàn)證”,可以解決50%(只是經(jīng)驗(yàn)值,后文不再解釋)以上的企業(yè)應(yīng)用安全攻擊。
概念解釋:
1.輸入
廣義的“輸入”是相對于發(fā)送端與接收端的一個相對的概念,對于基于HTTP的web應(yīng)用程序,那就是來自于瀏覽器這一端發(fā)往HTTP服務(wù)端請求數(shù)據(jù)包皆為輸入,以此類推,請求端的所有數(shù)據(jù)對于服務(wù)端來說皆為數(shù)據(jù)輸入。
2.輸入驗(yàn)證
就是在服務(wù)端(強(qiáng)調(diào)一下:是服務(wù)端,而不是客戶端)依據(jù)業(yè)務(wù)邏輯的需要對來自于客戶端數(shù)據(jù)進(jìn)行合法性校驗(yàn)的過程。
我們先從兩個大家最熟悉的安全攻擊開始來看看它們與輸入的關(guān)系是什么。
例1,XSS(跨站腳本攻擊),大家可以在firefox上試一下這個測試鏈接:
http://www.testfire.net/search.aspx?txtSearch=<script>alert%2812345%29<%2Fscript>
這就是一個典型的反射式跨站腳本攻擊,它的過程是這樣的:字符串<script>alert%2812345%29<%2Fscript>通過HTTP的請求傳送到服務(wù)端,服務(wù)端經(jīng)過自己的業(yè)務(wù)邏輯處理后返回到瀏覽器這一端,由于返回后未做正確的編碼,以至于在客戶端被瀏覽器執(zhí)行。
例2,SQLInjection(SQL注入攻擊),大家也可以在firefox上測試一下這個鏈接:
這是一個典型的SQL注入問題,它的過程是這樣的,字符串a(chǎn)dmin%27+or+%271%27%3D%271的原型是:admin’or’1′=’1,這顯然是通過猜測應(yīng)用程序后臺的實(shí)現(xiàn)方式,假設(shè)后臺程序?qū)崿F(xiàn)人員通過把用戶的輸入拼裝到SQL查詢語句上進(jìn)行SQL查詢的,以至于輕易的被黑客注入自編的SQL語句,騙過登錄驗(yàn)證邏輯而成功以管理員身份登錄。
這兩個例子當(dāng)中,輸入項(xiàng)有許多,我們只關(guān)注txtSearch/uid/passw這三個輸入點(diǎn),它們是這兩個問題的輸入源,對它進(jìn)行輸入驗(yàn)證是否有意義呢?當(dāng)然有。假如我們的業(yè)務(wù)邏輯上只要求txtSearch/uid/passw這個輸入點(diǎn)長度只需要15,數(shù)據(jù)類型只需要數(shù)字與英文字母即可滿足產(chǎn)品的設(shè)計(jì)需求,那么我們則可以這么做:
1)服務(wù)端獲取txtSearch/uid/passw的值
2)確認(rèn)它的長度是否超過15
3)它的值是否只包含字母與數(shù)字
后臺實(shí)現(xiàn)上,只有以上條件完全滿足,再進(jìn)行進(jìn)一步業(yè)務(wù)邏輯處理,否則以友好的方式告知客戶端輸入非法。當(dāng)然,為了更好的用戶體驗(yàn),可以在客戶端(假如是HTTPweb應(yīng)用程序)用JS實(shí)時的動態(tài)提示用戶本處可以接受的合法輸入是什么。這么做的好處是什么?
1)對于第一個例子,如果我們因?yàn)槭韬龌蛘吣承┪搭A(yù)料原因而導(dǎo)致XSS問題,由于你的限制足夠苛刻,以至于即便有XSS問題,黑客也難以對其進(jìn)行很好的利用,因?yàn)橛虚L度限制,也有字符集的限制。
2)對于第二個例子,如果我們真的因?yàn)閷?shí)現(xiàn)上的疏忽而留下了SQL注入的安全問題,也會因?yàn)樽址⒆址L度的限制而讓黑客無法進(jìn)一步利用它做更多的壞事兒。
以上只是拋磚引玉,象目錄遍歷、文件上傳、緩沖區(qū)溢出等等諸多應(yīng)用安全問題,均可通過合理的正確的輸入驗(yàn)證方式減少、降低甚至避免安全攻擊的發(fā)生。
關(guān)于輸入驗(yàn)證,個人將其分為兩大類,一類是普通的字符串輸入,絕大多數(shù)是屬于這一類;另一類是支持富文本的輸入,比如文檔編輯、允許用戶輸入簡單標(biāo)簽的輸入點(diǎn)。對于第二類,可以使用OWASP提供的AntiSamy(https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project)框架來輔助解決。
最后強(qiáng)調(diào)一下就是:我并沒有想表達(dá)做好輸入驗(yàn)證就可以解決所有的安全問題,它的重要程度、利害關(guān)系及意義通過以上的描述,我想已經(jīng)表達(dá)清楚了。做好輸入驗(yàn)證的座右銘是:永遠(yuǎn)不要相信來自于客戶端的輸入,這里的輸入不僅僅是顯式的用戶直接輸入,同時也包括隱式的協(xié)議數(shù)據(jù)包部分。