MVC框架安全
??MVC是Model-View-Controller的縮寫,它將web應(yīng)用分為三層,view層負(fù)責(zé)用戶視圖、頁面展示等工作;controler負(fù)責(zé)應(yīng)用的邏輯實(shí)現(xiàn),接收view層傳入的用戶請求,并轉(zhuǎn)發(fā)給對應(yīng)的model做處理;model層負(fù)責(zé)實(shí)現(xiàn)模型,完成數(shù)據(jù)的處理。
??從數(shù)據(jù)的流入來看,用戶提交的數(shù)據(jù)先后流經(jīng)了view層、controller、model層,數(shù)據(jù)的流出則是反過來。在設(shè)計(jì)安全方案時(shí),要牢牢把握住數(shù)據(jù)這個(gè)關(guān)鍵因素。在MVC框架中,通過切片、過濾器等方式,往往能對數(shù)據(jù)進(jìn)行全局處理,這為設(shè)計(jì)安全方案提供了極大的便利。
??一些主要的web安全威脅,如XSS、CSRF、SQL注入、訪問控制、認(rèn)證、URL跳轉(zhuǎn)等不涉及業(yè)務(wù)邏輯的安全問題,都可以集中放在MVC框架中解決。放在框架中統(tǒng)一解決,能夠大大節(jié)省程序員的工作量,節(jié)約人力成本。有可能解決“遺掉漏洞”的問題。,可以使所有基于框架開發(fā)的業(yè)務(wù)都能受益。
模板引擎與XSS防御
??在view層可以解決XSS問題。XSS攻擊是在用戶的瀏覽器上執(zhí)行的,其形成過程則是在服務(wù)器端頁面渲染時(shí),注入了惡意的HTML代碼導(dǎo)致的。從MVC架構(gòu)來說是發(fā)生在view層,因此使用“輸出編碼”的防御方法更加合理,這意味著需要針對不同的XSS攻擊場景使用不同的編碼方式(HTML標(biāo)簽、屬性、script標(biāo)簽、事件、CSS、URL)針對不同的情況,使用不同的編碼函數(shù)。
??在velocity提供的處理機(jī)制,與Django的auto-escape所提供的機(jī)制是類似的,都只進(jìn)行了HTMLencode,而為未細(xì)分編碼使用的具體場景,但是在模板引擎中,可以實(shí)現(xiàn)自定義的編碼函數(shù),應(yīng)用于不同的場景。在Django中是使用自定義filters,在velocity中則可以使用“宏”(velocimacro)。
??通過自定義的方法,使得XSS防御的功能得到完善;同時(shí)在模板系統(tǒng)中,搜索不安全的變量也有了依據(jù),甚至在代碼檢測工具中,可以自動(dòng)判斷出需要使用那一種安全的編碼方法,這在安全開發(fā)中是非常重要的。
Web框架與CSRF防御
??在web框架中可以使用security token解決CSRF攻擊問題。CSRF攻擊的目標(biāo)一般都會(huì)產(chǎn)生“寫數(shù)據(jù)”操作的URL(例:增刪改),而“讀數(shù)據(jù)”的的操作并不是CSRF的攻擊目標(biāo),因?yàn)樵贑SRF的攻擊過程中攻擊者無法獲取到服務(wù)器端返回的數(shù)據(jù),攻擊者只是借用戶之手觸發(fā)服務(wù)器動(dòng)作。
??完整的CSRF防御方案,對于Web框架來說有以下建議:
1.在session中綁定token,如果不能保存在服務(wù)端session中,則可以替代為保存在cookie中。
2.在form表單中自動(dòng)填入token字段。
3.在Ajax請求中自動(dòng)添加token,這可能需要已有的Ajax封裝實(shí)現(xiàn)的支持。
4.在服務(wù)器端對比post提交參數(shù)的token與session中綁定的token是否一致,以驗(yàn)證CSRF攻擊。
HTTP Headers管理
??在web框架中,可以對HTPP頭進(jìn)行全局化的處理,因此一些基于HTTP頭的安全方案可以更好的實(shí)施。比如針對HTTP返回頭的CRLF注入,因?yàn)镠TTP頭實(shí)際上可以看成是key-value對。因此對抗CRLF的方案只需在“value”中編碼所有的\r\n即可。這里沒有提到在“key”中編碼\r\n,是因?yàn)樽層脩裟軌蚩刂啤発ey”是極其危險(xiǎn)的事情。
??并不是所有的web服務(wù)器、web容器、腳本語言提供的API都支持設(shè)置HTTPonly cookie,所以很多時(shí)候需要由框架實(shí)現(xiàn)一個(gè)功能:對所有的cookie默認(rèn)添加HTTPonly,不需要此功能的cookie則單獨(dú)在配置文件中列出。
??一般來說,框架會(huì)提供一個(gè)統(tǒng)一的設(shè)置cookie函數(shù),HTTPonly的功能可以在此函數(shù)中實(shí)現(xiàn);如果沒有這樣的函數(shù),則需要統(tǒng)一在HTTP返回頭中配置實(shí)現(xiàn)。
數(shù)據(jù)持久層與SQL注入
??使用ORM(object/relation mapping)框架對SQL注入是有積極意義的。對抗SQL注入的最佳方法是使用“預(yù)編譯綁定變量”。在實(shí)際解決SQL注入時(shí),還有一個(gè)難點(diǎn)就是應(yīng)用復(fù)雜后,代碼數(shù)量龐大,難以把可能存在SQL注入的地方不遺漏的找出來,而利用ORM框架解決此問題是一個(gè)便捷的途徑。
web框架自身安全
??凡是在web框架中可能實(shí)現(xiàn)的安全方案,只要對性能沒有太大的損耗,都應(yīng)該考慮實(shí)施。在設(shè)計(jì)整體安全方案時(shí),比較科學(xué)的方法是:首先建立威脅模型,然后再判斷那些威脅是可以在框架中得到解決的。web框架就像一層外衣,為web應(yīng)用提供了足夠的保護(hù)和控制力。
小結(jié)
??在web框架中可以實(shí)施一些安全方案。web框架本身也是應(yīng)用程序的一個(gè)組成部分,只是這個(gè)組成部分較為特殊,處于基礎(chǔ)和底層的位置。web框架為安全方案設(shè)計(jì)提供了便利,但是很多web框架提供的解決方案有時(shí)并不可靠,同時(shí)web框架自身的安全性也不能忽視。