背景
說來慚愧,6 年的 web 編程生涯,一直沒有真正系統(tǒng)的學(xué)習(xí) web 安全知識(shí)(認(rèn)證和授權(quán)除外),這個(gè)月看了一本《Web 安全設(shè)計(jì)之道》,書中的內(nèi)容多是從微軟官方文檔翻譯而來,這本書的含金量不高,不過也不能說沒有收獲,本文簡單記錄一下我學(xué)習(xí) Web 安全方面的筆記。
本文不涉及 IIS、Windows 和 SqlServer 的安全管理與配置,盡量只談編程相關(guān)的安全問題。
最簡單的 Web 物理架構(gòu)

您必須了解 HTTP 協(xié)議,可以閱讀這篇文章:HTTP 協(xié)議詳解,簡單總結(jié)如下:
瀏覽器和服務(wù)器的通信采用無狀態(tài)的 HTTP 協(xié)議。
通過控制 HTTP 的請(qǐng)求頭,可以控制:客戶端緩存、Cookie、請(qǐng)求編碼、相應(yīng)編碼等。
請(qǐng)求內(nèi)容向服務(wù)器提交數(shù)據(jù)(POST 和 GET),響應(yīng)內(nèi)容向?yàn)g覽器發(fā)送數(shù)據(jù)。
Cookie 包含在每個(gè)請(qǐng)求和響應(yīng)中,因此客戶端和服務(wù)器都可以訪問到。
一般使用 Cookie 來維護(hù)一個(gè)瀏覽器會(huì)話(也有其他方式)。
攻擊方式總覽

這里有一個(gè)一般性的介紹:網(wǎng)站安全。
Web 軟件安全攻擊防護(hù)
瀏覽器安全攻擊
Cookie 假冒

定義
非期望的修改 Cookie 的值。
場(chǎng)景
服務(wù)器將用戶的授權(quán)信息存儲(chǔ)在 Cookie 中,然后客戶端用這些 Cookie 決定導(dǎo)航的顯示與否。如果有程序惡意的修改了Cookie,會(huì)導(dǎo)致權(quán)限提升。
攻擊方式
注入的 Javascript 代碼。
使用瀏覽器調(diào)試工具。
本機(jī)病毒等。
防護(hù)措施
盡量將 Cookie 設(shè)置為 HttpOnly,瀏覽器偽造不了這種 Cookie。
防止 Javascript 注入。
隱藏變量修改

定義
非期望的修改隱藏變量。
場(chǎng)景
訂單的折扣計(jì)算完全依賴客戶端的某個(gè)變量,這個(gè)變量是從服務(wù)器生成的,所有邏輯都在客戶端計(jì)算,服務(wù)器只是接受最后的計(jì)算結(jié)果。如果有程序惡意的修改了變量,會(huì)繞過某些業(yè)務(wù)邏輯。
攻擊方式
注入的 Javascript 代碼。
使用瀏覽器調(diào)試工具。
保護(hù)措施
防止 Javascript 注入。
關(guān)鍵的功能不要依靠客戶端控制,要采用服務(wù)器控制。
跨站腳本攻擊

定義
惡意的提交 Javascript 代碼。
場(chǎng)景
在博客的評(píng)論功能中,如果用戶惡意的提交 Javascript 代碼,假如這些 Javascript 沒有被過濾,極端的情況下,這些代碼會(huì)劫持所有訪問此頁面用戶的會(huì)話,訪問和修改任意數(shù)據(jù)。
攻擊方式
注入的 Javascript 代碼。
使用瀏覽器調(diào)試工具。
保護(hù)措施
在服務(wù)器端驗(yàn)證和過濾惡意輸入。
開啟?ValidateRequest="true"。
對(duì)輸出使用?this.Server.HtmlEncode。
服務(wù)器安全攻擊
緩沖區(qū)溢出

定義
某些可能輸入會(huì)導(dǎo)致服務(wù)器堆棧溢出,這直接致使服務(wù)器不可用。
場(chǎng)景
程序提供了某項(xiàng)計(jì)算密集型的功能,此功能沒有限制用戶輸入,用戶在有意或無意之間輸入了一個(gè)非法的值,導(dǎo)致了緩沖區(qū)溢出。
攻擊方式
非法輸入。
保護(hù)措施
在服務(wù)器端驗(yàn)證和過濾惡意輸入。
采用防偽式編程。
認(rèn)證逃避
定義
某些 URL 沒有出現(xiàn)在主頁導(dǎo)航界面,系統(tǒng)只對(duì)導(dǎo)航頁面進(jìn)行了認(rèn)證和授權(quán)管理,這些沒有出現(xiàn)在導(dǎo)航中的 URL 可能被惡意用戶給分析出來,直接進(jìn)行訪問。
場(chǎng)景
用戶管理分為三個(gè)頁面:List.aspx、New.aspx,程序只對(duì) List.aspx 進(jìn)行認(rèn)證和授權(quán)了,某些用戶直接訪問 New.aspx 執(zhí)行添加操作。
攻擊方式
直接地址訪問。
保護(hù)措施
梳理網(wǎng)站的整體結(jié)構(gòu),對(duì)所有頁面進(jìn)行認(rèn)證和授權(quán)管理。
非法輸入

定義
病從口入,禍從口出。很多攻擊方式都是因?yàn)榉欠ㄝ斎雽?dǎo)致的。
場(chǎng)景
程序只在客戶端對(duì)輸入進(jìn)行了驗(yàn)證,服務(wù)器未做任何驗(yàn)證,惡意的程序可以繞過客戶端邏輯直接向服務(wù)器提交非法輸入,這很容易導(dǎo)致各種安全問題。
攻擊方式
注入的 Javascript 代碼。
使用瀏覽器調(diào)試工具。
保護(hù)措施
在服務(wù)器端驗(yàn)證和過濾惡意輸入。
防止 Javascript 注入。
授權(quán)逃避
定義
某些 URL 沒有出現(xiàn)在主頁導(dǎo)航界面,系統(tǒng)只對(duì)導(dǎo)航頁面進(jìn)行了認(rèn)證和授權(quán)管理,這些沒有出現(xiàn)在導(dǎo)航中的 URL 可能被惡意用戶給分析出來,直接進(jìn)行訪問。還有一種可能是:系統(tǒng)只在客戶端進(jìn)行了授權(quán)管理,服務(wù)器代碼并沒有進(jìn)行授權(quán)驗(yàn)證,惡意用戶很容易就可以逃避授權(quán)。
場(chǎng)景
當(dāng)用戶沒有 Create 權(quán)限的時(shí)候,系統(tǒng)只是禁用了瀏覽器按鈕,并沒有做服務(wù)器授權(quán),然后用戶使用瀏覽器調(diào)試工具啟用了按鈕,就可以執(zhí)行 Create 了。
攻擊方式
直接地址訪問。
修改客戶端代碼。
保護(hù)措施
梳理網(wǎng)站的整體結(jié)構(gòu),對(duì)所有頁面進(jìn)行認(rèn)證和授權(quán)管理。
在服務(wù)器進(jìn)行授權(quán)管理。
SQL 注入

定義
對(duì)于和后臺(tái)數(shù)據(jù)庫產(chǎn)生交互的網(wǎng)頁,如果沒有對(duì)用戶輸入數(shù)據(jù)的合法性進(jìn)行全面的判斷,就會(huì)使應(yīng)用程序存在安全隱患。用戶可以在可以提交正常數(shù)據(jù)的URL或者表單輸入框中提交一段精心構(gòu)造的數(shù)據(jù)庫查詢代碼,使后臺(tái)應(yīng)用執(zhí)行攻擊著的SQL代碼,攻擊者根據(jù)程序返回的結(jié)果,獲得某些他想得知的敏感數(shù)據(jù),如管理員密碼,保密商業(yè)資料等。
場(chǎng)景
服務(wù)器程序使用字符串拼接的方式來構(gòu)造 SQL 語句,這就會(huì)導(dǎo)致 SQL 注入攻擊的可能。
攻擊方式
惡意的提交 SQL 片段。
保護(hù)措施
在服務(wù)器端驗(yàn)證和過濾惡意輸入。
不要拼湊 SQL 參數(shù),采用 DbParameter 設(shè)置參數(shù)。
最小化 SQL Server 訪問賬戶的權(quán)限。
異常敏感信息泄露

定義
未處理異常直接顯示到瀏覽器,這會(huì)導(dǎo)致敏感信息被泄露,對(duì)最終用戶來說,也會(huì)讓他們感覺系統(tǒng)不夠安全和易用。
場(chǎng)景
因?yàn)殚_發(fā)原因,在某些場(chǎng)景下瀏覽器將后端的異常直接顯示給瀏覽器了,如:NullReferenceException等。
攻擊方式
在調(diào)用的最上層,為處理掉全部異常。
在調(diào)用的下層,為封裝合適的異常信息。
保護(hù)措施
定義合理的異常處理策略。
異常一定不能跨越邊界直接顯示到瀏覽器。
上傳攻擊

定義
用戶惡意的上傳外掛、木馬和其它程序等。
場(chǎng)景
你做了一個(gè)上傳功能,結(jié)果對(duì)上傳的文件沒有做好足夠的控制,比如:某些惡意的用戶會(huì)上傳一些惡意的腳本,然后執(zhí)行這些腳本。
攻擊方式
上傳惡意文件。
保護(hù)措施
在服務(wù)器端驗(yàn)證和過濾惡意輸入,如:后綴名限制。
對(duì)上傳后的文件進(jìn)行掃描和殺毒。
抵賴

定義
某些用戶由于某些原因,不愿意承認(rèn)自己執(zhí)行過某些操作,當(dāng)然,某些操作可能是他們沒有意識(shí)的情況下執(zhí)行的。
場(chǎng)景
用戶一不小心執(zhí)行的刪除操作,然后立即發(fā)現(xiàn)自己操作錯(cuò)誤了,然后他打電話給售后,說系統(tǒng)有問題。
攻擊方式
界面引導(dǎo)不夠友好,容易導(dǎo)致誤操作,為了推卸責(zé)任,進(jìn)行抵賴。
用戶惡意的執(zhí)行操作,然后抵賴。
保護(hù)措施
提高界面的易用性。
關(guān)鍵操作的提醒要足夠明顯。
所有操作要留下操作日志。
數(shù)據(jù)庫安全攻擊
連接字符串暴漏
定義
數(shù)據(jù)庫連接字符串中包含用戶名和密碼,這些信息以明文的形式存儲(chǔ)在配置文件中,運(yùn)維和開發(fā)人員都能看得到,隨著團(tuán)隊(duì)人員的流動(dòng),這些敏感信息也會(huì)暴漏。
場(chǎng)景
直接將連接字符串配置在 Web.Config 中,而這個(gè)文件沒有被加密。
攻擊方式
未加密連接字符串。
未加密配置文件。
保護(hù)措施
加密連接字符串。
加密配置文件。
存儲(chǔ)數(shù)據(jù)泄露和篡改
定義
某些敏感信息最終需要被存儲(chǔ)在數(shù)據(jù)庫中,如果這些信息被存儲(chǔ)為明文,會(huì)有很多人員可以看到這些信息,極端情況下,某些黑客攻陷了服務(wù)器,也可以看到這些數(shù)據(jù)。
場(chǎng)景
為加密密碼、關(guān)鍵財(cái)務(wù)信息,稅務(wù)局來查賬了。
攻擊方式
未加密敏感數(shù)據(jù)。
加密方法過于簡單。
保護(hù)措施
加密敏感數(shù)據(jù)。
對(duì)某些數(shù)據(jù)采用不可逆加密,如:密碼。
對(duì)某些數(shù)據(jù)采用可逆加密,如:財(cái)務(wù)數(shù)據(jù)。
網(wǎng)絡(luò)安全攻擊
拒絕服務(wù)攻擊
定義
惡意用戶試圖攻擊服務(wù)器、網(wǎng)絡(luò)和系統(tǒng),最終的目的是讓系統(tǒng)不可用,停止對(duì)外服務(wù)。
場(chǎng)景
惡意用戶在嘗試并發(fā)的無限制的向服務(wù)器發(fā)送請(qǐng)求,試圖讓服務(wù)器的負(fù)載達(dá)到最大,最終讓系統(tǒng)停止對(duì)外服務(wù)。
攻擊方式
攻擊網(wǎng)絡(luò)。
攻擊服務(wù)器。
攻擊系統(tǒng)。
保護(hù)措施
在程序級(jí)別,識(shí)別并攔截惡意的請(qǐng)求。
購買第三方安全軟件。
傳輸數(shù)組泄露、篡改
定義
惡意的代理服務(wù)器或路由器攔截用戶的請(qǐng)求,讀取或修改敏感數(shù)據(jù)。
場(chǎng)景
您在咖啡館發(fā)現(xiàn)了一個(gè)免費(fèi)的 WIFI,然后偷偷的接入了,您還暗自高興,當(dāng)您使用這個(gè)免費(fèi)的 WIFI 進(jìn)行網(wǎng)上沖浪的時(shí)候,您的各種信息都會(huì)被 WIFI 給攔截,如果是惡意的用戶,結(jié)果可想而知。
攻擊方式
綁架路由器。
免費(fèi) WIFI 騙局。
為加密的傳輸協(xié)議。
未加密的傳輸數(shù)據(jù)。
保護(hù)措施
加強(qiáng)客戶端路由的安全管理。
慎重的選擇代理服務(wù)器。
使用安全的傳輸協(xié)議,如:SSL。