背景
說來慚愧,6 年的 web 程式設計生涯,一直沒有真正系統的學習 web 安全知識(認證和授權除外),這個月看了一本《Web 安全設計之道》,書中的内容多是從微軟官方文檔翻譯而來,這本書的含金量不高,不過也不能說沒有收獲,本文簡單記錄一下我學習 Web 安全方面的筆記。
本文不涉及 IIS、Windows 和 SqlServer 的安全管理與配置,盡量隻談程式設計相關的安全問題。
最簡單的 Web 實體架構

浏覽器和伺服器的通信采用無狀态的 HTTP 協定。
通過控制 HTTP 的請求頭,可以控制:用戶端緩存、Cookie、請求編碼、相應編碼等。
請求内容向伺服器送出資料(POST 和 GET),響應内容向浏覽器發送資料。
Cookie 包含在每個請求和響應中,是以用戶端和伺服器都可以通路到。
一般使用 Cookie 來維護一個浏覽器會話(也有其他方式)。
攻擊方式總覽
Web 軟體安全攻擊防護
一、浏覽器安全攻擊
Cookie 假冒
定義
非期望的修改 Cookie 的值
場景
伺服器将使用者的授權資訊存儲在 Cookie 中,然後用戶端用這些 Cookie 決定導航的顯示與否。如果有程式惡意的修改了Cookie,會導緻權限提升
攻擊方式
注入的 Javascript 代碼
使用浏覽器調試工具
本機病毒等
防護措施
盡量将 Cookie 設定為 HttpOnly,浏覽器僞造不了這種 Cookie
防止 Javascript 注入
隐藏變量修改
非期望的修改隐藏變量
訂單的折扣計算完全依賴用戶端的某個變量,這個變量是從伺服器生成的,所有邏輯都在用戶端計算,伺服器隻是接受最後的計算結果。如果有程式惡意的修改了變量,會繞過某些業務邏輯
保護措施
關鍵的功能不要依靠用戶端控制,要采用伺服器控制
跨站腳本攻擊
惡意的送出 Javascript 代碼
在部落格的評論功能中,如果使用者惡意的送出 Javascript 代碼,假如這些 Javascript 沒有被過濾,極端的情況下,這些代碼會劫持所有通路此頁面使用者的會話,通路和修改任意資料。
在伺服器端驗證和過濾惡意輸入
開啟 ValidateRequest="true"
對輸出使用 this.Server.HtmlEncode
二、伺服器安全攻擊
緩沖區溢出
某些可能輸入會導緻伺服器堆棧溢出,這直接緻使伺服器不可用。
程式提供了某項計算密集型的功能,此功能沒有限制使用者輸入,使用者在有意或無意之間輸入了一個非法的值,導緻了緩沖區溢出。
非法輸入
采用防僞式程式設計
認證逃避
某些 URL 沒有出現在首頁導航界面,系統隻對導航頁面進行了認證和授權管理,這些沒有出現在導航中的 URL 可能被惡意使用者給分析出來,直接進行通路。
使用者管理分為三個頁面:List.aspx、New.aspx,程式隻對 List.aspx 進行認證和授權了,某些使用者直接通路 New.aspx 執行添加操作。
直接位址通路
梳理網站的整體結構,對所有頁面進行認證和授權管理
(舉例說明)
病從口入,禍從口出。很多攻擊方式都是因為非法輸入導緻的
程式隻在用戶端對輸入進行了驗證,伺服器未做任何驗證,惡意的程式可以繞過用戶端邏輯直接向伺服器送出非法輸入,這很容易導緻各種安全問題
授權逃避
某些 URL 沒有出現在首頁導航界面,系統隻對導航頁面進行了認證和授權管理,這些沒有出現在導航中的 URL 可能被惡意使用者給分析出來,直接進行通路。還有一種可能是:系統隻在用戶端進行了授權管理,伺服器代碼并沒有進行授權驗證,惡意使用者很容易就可以逃避授權
當使用者沒有 Create 權限的時候,系統隻是禁用了浏覽器按鈕,并沒有做伺服器授權,然後使用者使用浏覽器調試工具啟用了按鈕,就可以執行 Create 了
修改用戶端代碼
在伺服器進行授權管理
SQL 注入
對于和背景資料庫産生互動的網頁,如果沒有對使用者輸入資料的合法性進行全面的判斷,就會使應用程式存在安全隐患。使用者可以在可以送出正常資料的URL或者表單輸入框中送出一段精心構造的資料庫查詢代碼,使背景應用執行攻擊着的SQL代碼,攻擊者根據程式傳回的結果,獲得某些他想得知的敏感資料,如管理者密碼,保密商業資料等
伺服器程式使用字元串拼接的方式來構造 SQL 語句,這就會導緻 SQL 注入攻擊的可能
惡意的送出 SQL 片段
不要拼湊 SQL 參數,采用 DbParameter 設定參數
最小化 SQL Server 通路賬戶的權限
異常敏感資訊洩露
未處理異常直接顯示到浏覽器,這會導緻敏感資訊被洩露,對最終使用者來說,也會讓他們感覺系統不夠安全和易用
因為開發原因,在某些場景下浏覽器将後端的異常直接顯示給浏覽器了,如:NullReferenceException等
在調用的最上層,為處理掉全部異常
在調用的下層,為封裝合适的異常資訊
定義合理的異常處理政策
異常一定不能跨越邊界直接顯示到浏覽器
上傳攻擊
使用者惡意的上傳外挂、木馬和其它程式等
你做了一個上傳功能,結果對上傳的檔案沒有做好足夠的控制,比如:某些惡意的使用者會上傳一些惡意的腳本,然後執行這些腳本
上傳惡意檔案
在伺服器端驗證和過濾惡意輸入,如:字尾名限制
對上傳後的檔案進行掃描和殺毒
抵賴
某些使用者由于某些原因,不願意承認自己執行過某些操作,當然,某些操作可能是他們沒有意識的情況下執行的
使用者一不小心執行的删除操作,然後立即發現自己操作錯誤了,然後他打電話給售後,說系統有問題
界面引導不夠友好,容易導緻誤操作,為了推卸責任,進行抵賴
使用者惡意的執行操作,然後抵賴
提高界面的易用性
關鍵操作的提醒要足夠明顯
所有操作要留下記錄檔
三、資料庫安全攻擊
連接配接字元串暴露
資料庫連接配接字元串中包含使用者名和密碼,這些資訊以明文的形式存儲在配置檔案中,運維和開發人員都能看得到,随着團隊人員的流動,這些敏感資訊也會暴露
直接将連接配接字元串配置在 Web.Config 中,而這個檔案沒有被加密
未加密連接配接字元串
未加密配置檔案
加密連接配接字元串
加密配置檔案
存儲資料洩露和篡改
某些敏感資訊最終需要被存儲在資料庫中,如果這些資訊被存儲為明文,會有很多人員可以看到這些資訊,極端情況下,某些黑客攻陷了伺服器,也可以看到這些資料
為加密密碼、關鍵财務資訊,稅務局來查賬了
未加密敏感資料
加密方法過于簡單
加密敏感資料
對某些資料采用不可逆加密,如:密碼
對某些資料采用可逆加密,如:财務資料
四、網絡安全攻擊
拒絕服務攻擊
惡意使用者試圖攻擊伺服器、網絡和系統,最終的目的是讓系統不可用,停止對外服務
惡意使用者在嘗試并發的無限制的向伺服器發送請求,試圖讓伺服器的負載達到最大,最終讓系統停止對外服務
攻擊網絡
攻擊伺服器
攻擊系統
在程式級别,識别并攔截惡意的請求
購買第三方安全軟體
傳輸數組洩露、篡改
惡意的代理伺服器或路由器攔截使用者的請求,讀取或修改敏感資料
您在咖啡館發現了一個免費的 WIFI,然後偷偷的接入了,您還暗自高興,當您使用這個免費的 WIFI 進行網上沖浪的時候,您的各種資訊都會被 WIFI 給攔截,如果是惡意的使用者,結果可想而知
綁架路由器
免費 WIFI 騙局
為加密的傳輸協定
未加密的傳輸資料
加強用戶端路由的安全管理
慎重的選擇代理伺服器
使用安全的傳輸協定,如:SSL
備注
這篇算是安全方面的 Hello,World了,今後好好好學習一下安全方面的知識,目前找到了兩個好的資源,如:
Security in the .NET Framework
.NET Security Overview
![]()
安全:Web 安全學習筆記