談談對 Web 安全的理解

作為一個前端 er,掌握必要的網路安全知識是必要,下面我整理了幾種常見的網路攻擊方式及防禦技巧,本文內容來自網路,僅供參考。

CSRF 攻擊

CSRF(Cross-site request forgery), 中文名稱:跨站請求偽造,也被稱為:one click attack/session riding, 縮寫為:CSRF/XSRF

CSRF 可以簡單理解為:攻擊者盜用了你的身份,以你的名義發送惡意請求,容易造成個人隱私泄露以及財產安全。

如上圖所示:要完成一次 CSRF 攻擊,受害者必須完成:

  1. 登錄受信任網站,並在本地生成 cookie
  2. 在不登出 A 的情況下,訪問危險網站 B

舉個簡單的例子:

某銀行網站 A,它以 GET 請求來完成銀行轉賬的操作,如:

http://www.mybank.com/transfer.php?toBankId=11&money=1000n

而某危險網站 B,它頁面中含有一段 HTML 代碼如下:

<img src=http://www.mybank.com/transfer.php?toBankId=11&money=1000>n

某一天,你登錄了銀行網站 A,然後又訪問了危險網站 B,這時候你突然發現你的銀行賬號少了 1000 塊,原因是銀行網站 A 違反了 HTTP 規範,使用 GET 請求更新資源。

B 中的 <img> 以 GET 方式請求第三方資源(指銀行網站,這原本是一個合法的請求,但被不法分子利用了),由於你此前登錄銀行網站 A 且還未退出,這時候你的瀏覽器會帶上你的銀行網站 A 的 Cookie 發出 GET 請求,結果銀行伺服器收到請求後,認為這是一條合法的更新資源的操作,所以立刻進行轉賬操作,這樣就完成了一次簡單的跨站請求偽造。

銀行發現這個問題後,決定把獲取請求數據的方法改為 POST 請求,只獲取 POST 請求的數據,後台處理頁面 transfer.php 代碼如下:

<?phpn session_start();n if (isset($_POST[toBankId] &&isset($_POST[money]))n {n transfer($_POST[toBankId], $_POST[money]);n }n

這樣網站 B 就無法通過簡單的 POST 請求來完成轉賬請求了。然而,危險網站 B 與時俱進,將其頁面代碼修改了下:

<body onload="steal()">n <iframe name="steal" display="none">n   <form method="POST" name="transfer" action="http://www.myBank.com/transfer.php">n  t <input type="hidden" name="toBankId" value="11">n  t <input type="hidden" name="money" value="1000">n   </form>n </iframe>n</body>n

因為這裡危險網站 B 暗地裡發送了 POST 請求到銀行,通過一個隱藏的自動提交的表單來提交請求,同樣地完成了轉賬操作。

可以看出,CSRF 攻擊時源於 WEB 的隱式身份驗證機制!WEB 的身份驗證機制雖然可以保證一個請求是來自某個用戶的瀏覽器,但無法保證該請求是經過用戶批准發送的。

那麼如何進行 CSRF 防禦呢?

CSRF 防禦可以從服務端和客戶端兩方面著手,防禦效果是從服務端著手效果比較好,現在一般 CSRF 防禦液都在服務端進行的。

  • 關鍵操作只接受 POST 請求
  • 驗證碼:

CSRF 攻擊的過程,往往是在用戶不知情的情況下發生的,在用戶不知情的情況下構造網路請求,所以如果使用驗證碼,那麼每次操作都需要用戶進行互動,從而簡單有效地防禦了 CSRF 的攻擊。

但是如果你自啊一個網站作出任何舉動都要輸入驗證碼的話會嚴重影響用戶體驗,所以驗證碼一般只出現在特殊操作裡面,或者在註冊時候使用。

  • 檢測 Referer:

常見的互聯網頁面與頁面之間是存在聯繫的,比如你在 騰訊首頁 應該找不到通往 facebook.com 的鏈接的,比如你在某論壇留言,那麼不管你留言之後重定向到哪裡,之前的網址一定保留在新頁面中 Referer 屬性中。

通過檢查 Referer 的值,我們就可以判斷這個請求是合法的還是非法的,但是問題出在伺服器不是任何時候都接受到 Referer 的值,所以 Referer Check 一般用於監控 CSRF 攻擊的發生,而不用來抵禦攻擊。

  • Token:目前主流的做法是使用 Token 防禦 CSRF 攻擊

CSRF 攻擊要成功的條件在於攻擊者能夠準確地預測所有的參數從而構造出合法的請求,所以根據不可預測性原則,我們可以對參數進行加密從而防止 CSRF 攻擊,可以保存其原有參數不變,另外添加一個參數 Token,其值是隨機的,這樣攻擊者因為不知道 Token 而無法構造出合法的請求進行攻擊,所以我們在構造請求時候只需要保證:

  1. Token 要足夠隨機,使攻擊者無法準確預測
  2. Token 是一次性的,即每次請求成功後要更新 Token,增加預測難度
  3. Token 要主要保密性,敏感操作使用 POST,防止 Token 出現在 URL 中

最後值得注意的是,過濾用戶輸入的內容不能阻擋 CSRF 攻擊,我們需要做的事過濾請求的來源,因為有些請求是合法,有些是非法的,所以 CSRF 防禦主要是過濾那些非法偽造的請求來源。

XSS 攻擊:

XSS 又稱為 CSS,全程為 Cross-site script,跨站腳本攻擊,為了和 CSS 層疊樣式表區分所以取名為 XSS,是 Web 程序中常見的漏洞。

其原理是攻擊者向有 XSS 漏洞的網站中輸入惡意的 HTML 代碼,當其它用戶瀏覽該網站時候,該段 HTML 代碼會自動執行,從而達到攻擊的目的,如盜取用戶的 Cookie,破壞頁面結構,重定向到其它網站等。

例如:某論壇的評論功能沒有對 XSS 進行過濾,那麼我們可以對其進行評論,評論如下:

<script>nwhile(true) {n alert(你關不掉我);n}n</script>n

在發布評論中含有 JS 的內容文本,這時候如果伺服器沒有過濾或轉義掉這些腳本,作為內容發布到頁面上,其他用戶訪問這個頁面的時候就會運行這段腳本。

這只是一個簡單的小例子,惡意著可以將上述代碼修改為惡意的代碼,就可以盜取你的 Cookie 或者其它信息了。

XSS 類型:

一般可以分為: 持久型 XSS 和非持久性 XSS

  1. 持久型 XSS 就是對客戶端攻擊的腳本植入到伺服器上,從而導致每個正常訪問到的用戶都會遭到這段 XSS 腳本的攻擊。(如上述的留言評論功能)
  2. 非持久型 XSS 是對一個頁面的 URL 中的某個參數做文章,把精心構造好的惡意腳本包裝在 URL 參數重,再將這個 URL 發布到網上,騙取用戶訪問,從而進行攻擊

非持久性 XSS 的安全威脅比較小,因為只要伺服器調整業務代碼進行過濾,黑客精心構造的這段 URL 就會瞬間失效了,而相比之下,持久型 XSS 的攻擊影響力很大,有時候服務端需要刪好幾張表,查詢很多庫才能將惡意代碼的數據進行刪除。

如何防禦 XSS 攻擊?

理論上,網站上所有可輸入的地方沒有對輸入內容進行處理的話,都會存在 XSS 漏洞,漏洞的危險取決於攻擊代碼的威力,攻擊代碼也不局限於 script,防禦 XSS 攻擊最簡單直接的方法就是過濾用戶的輸入。

  • 如果不需要用戶輸入 HTML,可以直接對用戶的輸入進行 HTML 轉義:

<script>nwindow.location.href="http://www.xss.com";n</script>n

經過轉義後就成了:

<script>window.location.href="http://www.baidu.com"</script>n

它現在會像普通文本一樣顯示出來,變得無毒無害,不能執行了。

  • 當用戶需要輸入 HTML 代碼時:

當我們需要用戶輸入 HTML 的時候,需要對用戶輸入的內容做更加小心細緻的處理。

僅僅粗暴地去掉 script 標籤是沒有用的,任何一個合法 HTML 標籤都可以添加 onclick 一類的事件屬性來執行 JavaScript。

更好的方法可能是,將用戶的輸入使用 HTML 解析庫進行解析,獲取其中的數據。然後根據用戶原有的標籤屬性,重新構建 HTML 元素樹。構建的過程中,所有的標籤、屬性都只從白名單中拿取。

SQL 注入:

所謂 SQL 注入,就是通過把 SQL 命令插入到 Web 表單提交或頁面請求的查詢字元串,最終達到棋牌呢伺服器執行惡意的 SQL 命令。

具體來說,它是利用現有應用程序,將(惡意) 的 SQL 命令注入到後台資料庫引擎執行的能力,它可以通過在 Web 表單中輸入 (惡意) SQL 語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行 SQL 語句。

SQL 防護:

  1. 永遠不要信任用戶的輸入: 對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和雙"-"進行轉換等。
  2. 永遠不要使用動態拼裝 SQL,可以使用參數化的 SQL 或者直接使用存儲過程進行數據查詢存取。
  3. 永遠不要使用管理員許可權的資料庫連接,為每個應用使用單獨的許可權有限的資料庫連接。
  4. 不要把機密信息直接存放,加密或者 hash 掉密碼和敏感的信息。

DDOS 攻擊:

分散式拒絕服務(DDoS:Distributed Denial of Service)攻擊指藉助於客戶/伺服器技術,將多個計算機聯合起來作為攻擊平台,對一個或多個目標發動DDoS攻擊,從而成倍地提高拒絕服務攻擊的威力。

可以打個比方:

一群惡霸試圖讓對面那家有著競爭關係的商鋪無法正常營業,他們會採取什麼手段呢?(只為舉例,切勿模仿)

惡霸們扮作普通客戶一直擁擠在對手的商鋪,賴著不走,真正的購物者卻無法進入;或者總是和營業員有一搭沒一搭的東扯西扯,讓工作人員不能正常服務客戶;也可以為商鋪的經營者提供虛假信息,商鋪的上上下下忙成一團之後卻發現都是一場空,最終跑了真正的大客戶,損失慘重。

此外惡霸們完成這些壞事有時憑單幹難以完成,需要叫上很多人一起。嗯,網路安全領域中 DoS 和 DDoS 攻擊就遵循著這些思路。

DDOS 攻擊利用目標系統網路服務功能缺陷或者直接消耗其系統資源,使得該目標系統無法提供正常的服務。

DDoS 攻擊通過大量合法的請求佔用大量網路資源,以達到癱瘓網路的目的。 具體有幾種形式:

  1. 通過使網路過載來干擾甚至阻斷正常的網路通訊;
  2. 通過向伺服器提交大量請求,使伺服器超負荷;
  3. 阻斷某一用戶訪問伺服器;
  4. 阻斷某服務與特定系統或個人的通訊。

SYN 攻擊:

屬於 DDOS 攻擊中的一種具體表現形式。

在三次握手過程中,伺服器發送 SYN-ACK 之後,收到客戶端的 ACK 之前的 TCP 連接稱為半連接(half-open connect)。此時伺服器處於 SYN_RCVD 狀態。當收到 ACK 後,伺服器才能轉入 ESTABLISHED 狀態.

SYN 攻擊指的是,攻擊客戶端在短時間內偽造大量不存在的 IP 地址,向伺服器不斷地發送 SYN 包,伺服器回復確認包,並等待客戶的確認。

由於源地址是不存在的,伺服器需要不斷的重發直至超時,這些偽造的 SYN 包將長時間佔用未連接隊列,正常的 SYN 請求被丟棄,導致目標系統運行緩慢,嚴重者會引起網路堵塞甚至系統癱瘓。

檢測 SYN 攻擊:檢測 SYN 攻擊非常的方便,當你在伺服器上看到大量的半連接狀態時,特別是源 IP 地址是隨機的,基本上可以斷定這是一次 SYN 攻擊。

SYN 攻擊防護:

  1. 縮短超時(SYN Timeout)時間
  2. 增加最大半連接數
  3. 過濾網關防護

參考鏈接:

  • 淺談CSRF攻擊方式 - hyddd - 博客園

  • 分散式拒絕服務攻擊_百度百科

  • sql注入_百度百科

推薦閱讀:

其實你根本不知道你錯在哪裡
花無涯帶你走進黑客世界7 Dos命令
安全檔案第二期(多圖預警)
不要讓你的電腦為別人挖礦
Let's GoSSIP! 2017年軟體與移動智能系統安全暑期學校開始報名啦~

TAG:前端开发 | 网络安全 |