《web之困:現代web應用安全指南》在web安全領域有「聖經」的美譽,在世界範圍內被安全工做者和web從業人員廣爲稱道,由來自google chrome瀏覽器團隊的世界頂級黑客、國際一流安全專家撰寫,是目前惟一深度探索現代web瀏覽器安全技術的專著。本書從瀏覽器設計的角度切入,以探討瀏覽器的各主要特性和由此衍生出來的各類安全相關問題爲主線,深刻剖析了現代web瀏覽器的技術原理、安全機制和設計上的安全缺陷,爲web安全工做者和開發工程師們應對各類基於瀏覽器的安全隱患提供了應對措施。css
《web之困:現代web應用安全指南》開篇回顧了web的發展歷程和安全風險的演化;第一部分解剖了現代瀏覽器的工做原理,包括url、http協議、html語言、css、文檔格式、瀏覽器插件等內容;第二部分從瀏覽器的設計角度深刻分析了各類現代web瀏覽器(firefox、chrome、ie等)所引入的重點安全機制,例如同源策略、源的繼承、窗口和框架的交互、安全邊界、內容識別、應對惡意腳本、外圍的網站特權等,並分析了這些機制存在的安全缺陷,同時爲web應用開發者提供瞭如何避免攻擊和隱私泄露的應對措施;第三部分對瀏覽器安全機制的將來趨勢進行了展望,包括新的瀏覽器特性與安全展望、其餘值得注意的瀏覽器、常見的web安全漏洞等。 html
《web之困:現代web應用安全指南》 前端
譯者序
前 言
第1章 web應用安全 / 1
1.1 信息安全速覽 / 1
1.1.1 正統之道的尷尬 / 2
1.1.2 進入風險管理 / 4
1.1.3 分類學的啓發 / 5
1.1.4 實際的解決之道 / 6
1.2 web的簡明歷史 / 7
1.2.1 史前時期的故事: 1945~1994年 / 8
1.2.2 第一次瀏覽器大戰:1995~1999年 / 10
1.2.3 平淡期:2000~2003年 / 11
1.2.4 web 2.0 和第二次瀏覽器大戰:2004年以後 / 12
1.3 風險的演化 / 13
1.3.1 用戶做爲安全風險的一個環節 / 14
1.3.2 難以隔離的web運行環境 / 14
1.3.3 缺少統一的格局 / 15
1.3.4 跨瀏覽器交互:失敗的協同 / 16
1.3.5 客戶端和服務器端界限的日益模糊 / 17 ios
這是一本很特別的書。 程序員
在翻開本書以前,每位讀者可能都曾閱讀過一些Web安全相關的書籍。但本書的目標和寫法,與常規的Web安全書籍截然不同。套句江湖行話來講,這是一本修煉內功的祕籍,它並未傳授什麼具體的武功,不會手把手地教讀者怎麼練一門劍術或輕功,但它構建了一個完整的Web安全圖景,爲讀者在這個龐雜領域裏繼續深刻鑽研打下穩固的技術根基,相信每位打開這本「祕籍」的讀者都能從中獲益良多。 web
因此若是讀者打算找的是一本常規的「黑客手冊」,那它可能不適合你。本書做者浸淫安全領域多年,無疑是圈內頂尖高手,甚至本身也開發了網站漏洞掃描程序Skipfish。但在這本厚積薄發的技術書裏,他卻並無告訴讀者,要怎麼去黑掉一個網站或有什麼趁手工具可用,因此曾有國外讀者玩笑似地抱怨本書寫得不夠「邪惡」。的確,全書的前三分之一,做者都在討論貌似枯燥的各類RFC協議和規範的前因後果,解決什麼問題,具體機制是什麼,都潛藏了哪些漏洞或缺陷,以及這些問題的歷史根源。這一部分涵蓋了許多咱們熟悉的Web相關內容,好比URL、HTTP、HTML、JavaScript、CSS和插件等最基本的Web組件。但做者探索程度之深之廣,使人歎服(難怪Joey說這是Web安全的聖經)!在跟隨做者展開這場Web安全之旅時,即便最資深的Web開發工程師和安全滲透工程師只怕也會以爲亂花漸欲迷人眼,而這些問題所帶來的後果更時常使人彈眼落睛,怵目驚心—不少問題和陷阱,咱們本身又未嘗沒吃過虧呢。 算法
本書第二部分爲全書核心,主題爲瀏覽器安全機制,是做者更側重的研究領域。做者在前言裏開宗明義,提到本書源自他所維護的一個技術性維基站點「Google’s Browser Security Handbook」項目。做爲走在瀏覽器安全領域技術潮流前端的人物,做者關注的問題不但全面並且深刻。這一部分的重頭戲是同源策略,圍繞經典的同源策略應用,派生出不一樣場景裏的微妙差別、各類繼承關係以及跨域的解決方案,另外還涵蓋了同源策略沒法企及的一些犄角旮旯的方面。此外,做者還談到了被普遍忽略的瀏覽器內容自動識別問題,以及一些外圍的特權問題和惡意腳本的處理。對瀏覽器端的安全機制這一主題,多是第一次有人進行如此全面深刻的探討。也許國內的安全工程師和開發人員每每更側重服務器端的安全,但在當前的技術浪潮下,服務器端與瀏覽器端的界限已經愈來愈模糊,二者愈來愈緊密地相連,瀏覽器安全理應得到更多的關注,相信在全新的討論領域裏,讀者會受到許多啓發。 chrome
做者在最後展望了一批屬於將來的Web技術,以及它們對從此幾年Web安全可能產生的影響,有助於讀者瞭解前瞻性的技術動向。固然,因爲本書寫於兩年前,可能其中有部分機制已經被業界採納成爲正式的規範。 跨域
在許多章的最後,做者都給出了「安全工程速查表」,內容是和本章主題相關的安全建議。這些整理得當的安全列表對網站和Web組件的開發者、架構設計師們想必都會有很是直接的幫助。但同時,這個速查表和本書的其餘內容,也徹底能夠做爲安全滲透人員的反向指標,爲安全檢測帶來更多啓發性的思路。儘管本書一般被歸類爲「黑客」書籍,但它也一樣能爲Web開發人員和Web防護工程人員帶來實際的幫助。攻與防,在這裏有機地結合到了一塊兒。 瀏覽器
本書另外一個特別的地方是:它很是「紮實」!也就是說,乾貨不少很實在。原書只有不到300頁篇幅,卻涵蓋了Web各組件、瀏覽器所有安全機制和將來技術展望,知識點異常密集!可想而知,做者的寫法有多簡潔明瞭,這給翻譯帶來了不小的困難。而且容我冒昧吐槽一句,因爲做者本人很是聰明有才,每每不屑於把問題展開來闡述,因此一個很是複雜的知識點也常常被寥寥數語帶過,對沒有必定基礎的讀者來講,不免存在閱讀和理解障礙。在此譯者再囉嗦地提出幾點閱讀建議:
讀慢些,反覆讀。本書絕對不是那種讀一遍就能徹底領會、流暢易懂的書籍,適合它的閱讀方式應該是放在案頭,時常翻閱,常讀常新。
不要忽略文中帶上標的註釋。有些做者只寫了幾句話的地方,其實對應着一篇長達幾十頁的論文或很長的一篇網頁文章!若是看不懂原文可試着閱讀關聯的註釋內容或自行在搜索引擎裏尋找答案。
做者本人的「Google抯 Browser Security Handbook」項目是個獲取知識的寶庫,涉及不少瀏覽器端安全相關內容。在閱讀第二部分時,可配合閱讀和實驗。
譯者水平有限,不能盡顯原書之意,讀者閱讀時如覺理解困難,建議參考英文原文。
在本書的翻譯過程當中,獲得了各位師友無私的幫助,特此鳴謝!感謝姚莉莉的建議,促使我接下本書的翻譯,並在此後的翻譯過程當中給予了無數的幫助和監督;感謝編輯吳怡一直以來對個人耐心、寬容和信任;感謝Joey(殷鈞鈞)對本書的推薦和審讀,以及在翻譯過程當中提供的持續幫助;感謝賈洪峯老師和個人同事黃偉,他們對細節的關注,對技術的理解和對書稿的審閱,都使我獲益良多;另外也要感謝Xiaket(夏愷)、錢文芳對部分章節的審讀。
本書是譯者的第一本譯做,水平有限,錯誤不免。只有誠摯地但願讀者諸君在發現錯誤時請務必告知,我將創建一個勘誤表,做爲彌補之計。可以使用電子郵件與我聯繫:danzhu@gmail.com,或新浪微博:medanzhu。 前言 僅在15年前,互聯網仍是簡單而無足輕重的:這套古怪的機制不過是讓一羣學生,還有一夥不太合羣、住在地下室裏的科學怪人,能訪問彼此的我的主頁而已,這些主頁的內容多是科學、他們的寵物或詩歌什麼的。但到了今天,互聯網已成爲建立各類複雜交互應用的平臺(這些應用包括從郵件客戶端、圖片編輯器到電腦遊戲),它仍是一種遍及全球、無數普通用戶都能訪問的大衆媒體,同時它儼然已經是重要的商業手段,以至1999~2001年第一次互聯網泡沫破滅時,它正是致使經濟倒退的主要緣由。 即便以咱們所處的信息化時代標準來衡量,互聯網從默默無聞到無處不在,其發展速度也算異常驚人—但這種驚人的躍升速度也帶來許多難以預計的問題。互聯網在設計上的缺陷和實現上的漏洞與它的發展情況徹底不相稱,但咱們並無機會停下腳步回顧以前的錯誤。這些缺陷很快就致使今時今日許多嚴重又廣泛的數據安全問題:人們發現,當年那個用在簡單花哨我的主頁上的互聯網機制設計標準,已徹底不適用於當下每一年處理龐大信用卡交易的在線商店。 若是咱們回顧過去10年,內心不免會略有失落:幾乎每一個現在值得說道的在線應用,都由於貪圖方便而湊合着用從早期互聯網搬過來的技術,致使後期付出了沉重代價。以站點 xssed.com 爲例,它僅僅收集了無數Web安全問題中很特定的一種,但在3年的運營時間裏,已累計收集超過5萬次攻擊事件,真見鬼!然而,瀏覽器開發商仍是頗爲無動於衷,安全社區也未能就這些普遍存在的問題提出什麼有見地的建議。與此相對的是安全專家正孜孜不倦地建造一套複雜而炫目的漏洞分類學,並對這種混亂景象的根本緣由既習覺得常又隱隱擔心絕望。 致使上述問題的部分緣由,是因爲這些所謂的專家長久以來對Web安全的整個混亂狀態視而不見,對Web安全缺少真正的瞭解。他們很利落地給網站漏洞貼上各類標籤,好比「責任混淆」(confused deputy)問題的各類體現,或者乾脆用一些30年前商業期刊上慣常的抓眼球字眼。再說了,他們幹嗎要費心去關注網絡安全呢?一個關於寵物的無聊我的主頁上被加入了一段莫名其妙的註釋代碼哪能和傳統的針對操做系統的漏洞攻擊相提並論呢? 回顧過往,我確信咱們中的大多數人都有過打落牙齒和血吞的感受。不只由於互聯網的重要性已遠超當初人們的預期,並且咱們爲了知足本身的心理溫馨感,把一些重要的互聯網基礎特性置於不顧。結果致使即便設計最精良、通過最全面審覈的網站應用,也每每比一樣功能的非網站應用產生更多的問題。 咱們過去搞砸了,如今到悔恨彌補的時候了。出於這個考慮,本書指望能在亟需解決的標準化問題上取得一點進展, 除此之外,這也許仍是第一本系統而全面地剖析當下Web應用安全問題的書籍。爲達到這一目標,本書深刻描述了咱們平常面對的各類安全挑戰的獨特性,這裏的「咱們」包括安全專家、網站開發工程師和用戶。 本書的章節安排以探討瀏覽器的各主要特性和由此衍生出來的各類安全相關問題爲主線。由於比起隨便採用某種漏洞分類學來羅列問題(這是許多信息安全書籍一般採用的形式),但願這種方式能提供更豐富的信息和更直觀的效果。我還但願,這樣的安排能使本書更容易閱讀。 爲使讀者便捷地獲取答案,我會在每章的最後儘可能附上一份「安全工程速查表」。這些速查表爲網站應用設計中各類常見問題提供了一些合理的解決方向。此外,在本書的最後一章羅列了最多見的網站漏洞形式及其實現方式。 鳴謝 本書中的許多內容都源自Google抯 Browser Security Handbook項目,這是我從2008年開始維護整理的一個技術性維基站點,該站點以Creative Commons受權模式發佈。你能夠經過瀏覽如下網址:http://code.google.com/p/browsersec/ 獲取相關的源碼。我很幸運,由於這個項目不但得到公司的支持,並且能和一羣出色的同事一塊兒工做,使得Browser Security Handbook 的內容能更有用、更準確。在此,我要特別感謝Filipe Almeida、Drew Hintz、Mariu Schilder和Parisa Tabriz 的鼎力相助。 能站在巨人的肩膀上,對此我深感自豪。由於本書從安全社區成員對瀏覽器安全的普遍研究上獲益良多,特別感謝Adam Barth、Collin Jackson、Chris Evans、Jesse Ruderman、Billy Rios和Eduardo Vela Nava,他們極大地提升了咱們對這個領域的理解,爲這個領域做出了巨大貢獻。 無限感激—各位大牛們,繼續牛下去吧! 書摘 第1章 Web應用安全 爲了給本書後面的技術討論提供必要的背景知識,咱們首先解釋清楚安全領域涵蓋哪些方面,以及爲何在這個早已被研究得很透徹的領域裏,Web應用的安全仍然值得引發額外的關注。那麼,讓咱們開始吧? 1.1信息安全速覽 表面上看來,信息安全領域屬於計算機科學裏很成熟、明確且碩果累累的一個分支,自覺得無所不知的專家們經過展示他們那分類清晰、數量龐大的安全漏洞集來標榜這一領域的重要性。至於那些漏洞的責任嘛,就全都歸到那些「安全文盲」的程序員們頭上好了,而理論家們則會從旁指點,說只要聽從今年最熱門的某某安全方法學,早就能把這些問題都防患於未然了云云。安全問題更是帶動了一個產業的繁榮,但對用戶來說,從普通計算機用戶到龐大的國際公司等,其實並無帶來什麼有效的安全保障。 從根本上來講,過去幾十年,咱們甚至沒能構建出一個哪怕原始但至少還算可用的框架來理解和評估現代軟件的安全性。除了幾篇出色的論文和一些小範圍內取得的經驗,甚至沒法拿出什麼有說服力的真實的成功案例。如今的側重點幾乎都放在一些響應性質的、次要的安全方法上(如漏洞管理、惡意軟件和攻擊的檢測、沙盒技術以及其餘),要不就是經常對別人代碼裏的漏洞指指點點。一個使人不安而又祕而不宣的實情是:若是安全系統是由別人開發的,那咱們貢獻的價值實際上每每乏善可陳;在現代Web這件事情上則更是如此。 讓咱們來看看如下幾種最矚目的信息安全之道,並嘗試分析一下爲何到目前爲止,它們也沒能走出這一困境。 1.1.1正統之道的尷尬 也許開發一個安全程序最直接的途徑就是從算法上證實該程序的運行是正確的。從直覺來講,這個簡單的假設聽起來還蠻有道理的—那爲何此路不通呢? 首先讓咱們討論一下做爲形容詞時「安全」這兩字的含義。準確來講,它究竟是什麼意思呢?安全(Security)聽起來很直觀,但在計算機領域,就愣是無法給它下一個確切的定義。沒錯,咱們能夠用一些很眩目但基本沒啥意義的方式來描述安全,例如,在業界常常被引用的一個關於安全的定義以下,但實際上它也是有問題的: 若是系統能按既定的方式完成任務,不作額外的事情,那這套系統就是安全的。 這個定義很簡潔,也大體描述了一個抽象的目標,但它幾乎沒提到要怎麼作才能達成這個目標。雖然這句話的主題是關於計算機科學的,但其籠統程度,和維克多·雨果的一句詩倒有殊途同歸之妙: 愛情乃靈魂之一部分,就恍如仙氣瀰漫於天堂通常。 也許有人會反對說,這個棘手的定義不該該求諸於商業界,那好,咱們只管把這個問題拋給學術界吧,但他們也只會給出一個差很少的答案。例如,下面這個常見的學術界對安全的定義,它出自20世紀60年代出版的貝爾–拉帕杜拉安全模型(Bell-La Padula security model,這套規範是企圖規範化安全系統需求的諸多努力之一,這是一套針對國家機器的規範1;固然也是最知名的一套規範。) 當且僅當系統開始於安全的狀態,並且一直不會落入非安全狀態,它纔是安全的。 固然,像這些定義安全的文字從根本上來講都是正確的,用於論文的基調甚至政府規範都毫無問題。但實際上,對真實世界裏的軟件工程而言,因爲如下三個緣由,以這些理論爲基礎創建的模型幾乎是沒用的。 對一個足夠複雜的計算機系統來講,沒有辦法定義什麼是正確的行爲。對一個操做系統或者Web瀏覽器來講,沒有一個權威機構能定義什麼是「應該的方式」或者「安全的狀態」。最終用戶、系統全部者、數據提供者、業務流程全部者和軟件硬件開發商之間的利益是南轅北轍,而且說變就變—若是公司的股東們能夠隨心所欲,可以不加掩飾地優先考慮本身的利益,就更是如此了。雪上加霜的是,社會學和博弈論的研究代表,把各方利益作簡單的疊加運算,實際上並不能產生互贏的結果。這種兩難的困局就叫「公地悲劇」,在往後的互聯網發展裏它將一直是爭論的焦點。 美好的想法沒法自動轉換成規範的約束條件。即便經過給出系統應包含哪些具體用例,咱們能就係統該有的行爲達成完美的、高級別的共識,但這些用例幾乎不可能與可容許的輸入數據、程序的狀態和這些狀態的轉換一一對應起來,而要作正式的系統分析卻須要這種對應關係。很簡單,譬如,一個很常識性的概念「我不但願別人越權讀到個人電子郵件」,卻沒有辦法很好地翻譯成數據模型。也許有些劍走偏鋒的方法的確能把這種模糊的需求部分地轉換成規範化的表達,但對軟件開發過程帶來嚴重的限制,併產生比驗證算法(Validated Algorithm)更復雜的許多規則集和模型。而且,這些方法自身的正確性也還須要進一步驗證……這樣就走進了一個死循環。 很難使人信服地分析軟件的行爲。在複雜的真實世界的場景裏,徹底沒有辦法使人信服地經過對計算機程序的靜態分析,證實程序的運行是符合詳細設計規範的(固然,在高度受限的環境下或針對一個很是狹義的目標仍是有可能辦到的)。不少案例在實際環境中是無解的(由於計算的複雜程度),甚至有可能因爲停機問題(halting problem)而徹底沒法肯定其狀態。 對安全的這些早期定義既模糊又沒用,但使人抓狂的是,儘管幾十年過去了,事實上咱們取得的進展卻很是有限。2001年由Naval Research Laboratory發佈的一份學術報告回顧了軟件安全領域的早期工做,結果也不過是給軟件安全提供了一個更隨意的枚舉式的定義— 並且這個定義還明確否定其自身並不完善和不完整。