WEB安全(XSS、CSRF、DDoS等)

語言: CN / TW / HK

本文已參與「新人創作禮」活動,一起開啟掘金創作之路。

介紹:同源策略、XSS(跨站指令碼攻擊)、CSRF(跨站請求偽造攻擊)、DDoS(分散式拒絕服務)、實現跨域請求的兩種方式、SQL注入、流量劫持

同源策略

同源策略限制從一個源載入的文件或指令碼如何與來自另一個源的資源進行互動,這是一個用於隔離潛在惡意檔案的關鍵的安全機制。

同源需要滿足以下三個方面: * 協議相同 * 域名相同 * 埠相同

如果是非同源,則以下行為會受到限制: * Cookie、LocalStorage 和 IndexDB 無法讀取 * DOM 無法獲取 * AJAX 請求不能傳送

解決方案: * CORS 跨域資源共享:CORS 亦即 跨域資源共享,是一種 HTTP 機制,它使用額外的 HTTP 響應頭來告訴瀏覽器讓其執行在一個 origin (domain) 上的 Web 應用被准許訪問來自 不同源伺服器 上的指定的資源。 * Node 代理跨域:利用 Node + Express + Http-Proxy-Middleware 搭建一個 Proxy 伺服器。 * Nginx 代理跨域:Nginx 可實現用於反向代理的非同步 Web 伺服器,他除了用於反向代理以外還可以用於負載均衡、 HTTP 快取。 * JSONP:動態建立 <script> 指令碼標籤,通過跨域指令碼嵌入不受同源策略限制的方法實現請求第三方伺服器資料內容。 * WebSocket:WebSocket 是一種通訊協議,使用 ws://(非加密)和 wss://(加密)作為協議字首,該協議不實行同源政策,只要伺服器支援,就可以通過它進行跨源通訊。 * window.postMessage * document.domain + iframe * window.location.hash + iframe * window.name + iframe

XSS - Cross Site Script(跨站指令碼攻擊)

跨站指令碼攻擊(Cross Site Scripting,簡稱 XSS),利用網頁漏洞,在目標網站 HTML 頁面中注入惡意指令碼的攻擊方法。 XSS 攻擊的本質是惡意程式碼未經過濾,與網站正常的程式碼混在一起,瀏覽器無法分辨哪些指令碼是可信的,導致惡意指令碼被執行。

XSS攻擊分類

  • 儲存型XSS:將惡意程式碼儲存到漏洞伺服器中,使用者瀏覽相關頁面發起攻擊。
  • 反射型XSS:誘惑受害者去訪問一個包含惡意程式碼的URL,注入指令碼被傳輸到目標伺服器上,然後伺服器將注入指令碼 "反射"到受害者的瀏覽器上,從而瀏覽器就執行了該指令碼,反射是一次性的。
  • DOM-based型XSS:客戶端的js可以對頁面dom節點進行動態的操作,比如插入、修改頁面的內容

儲存型 XSS 的惡意程式碼 存在資料庫 裡,反射型 XSS 的惡意程式碼存在 URL 裡。

如何防範

  1. HttpOnly防止劫取Cookie:瀏覽器將禁止頁面的Javascript訪問帶有HttpOnly屬性的Cookie
  2. 輸入檢查:對於使用者的任何輸入要進行檢查、過濾和轉義
  3. 輸出檢查:伺服器被黑,返回一串惡意執行的程式碼

CSRF/XSRF - Cross Site Request Forgery(跨站請求偽造)

跨站請求偽造(Cross-site Request Forgery,簡稱 CSRF),冒用受害者的登入憑證,執行非本意的操作的攻擊方法。 CSRF 攻擊的本質是利用 cookie 會在同源請求中攜帶傳送給伺服器的特點,以此來實現使用者的冒充。

如何防範

  1. 驗證碼:驗證碼被認為是對抗 CSRF 攻擊最簡潔而有效的防禦方法
  2. Referer Check:根據 HTTP 協議,在 HTTP 頭中有一個欄位叫 Referer,它記錄了該 HTTP 請求的來源地址。通過 Referer Check,可以檢查請求是否來自合法的"源"
  3. token驗證:要抵禦 CSRF,關鍵在於在請求中放入攻擊者所不能偽造的資訊,並且該資訊不存在於 Cookie 之中

DDoS

分散式拒絕服務(Distributed Denial of Service,簡稱 DDoS),凡是能導致合法使用者不能夠正常訪問網路服務的行為都算是拒絕服務攻擊。

實現跨域請求的兩種方式

JSONP

JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。JSONP是JSON with Padding的略稱

jsonp跨域的原理: 1. 使用script 標籤傳送請求,這個標籤支援跨域訪問 2. 在script 標籤裡面給伺服器端傳遞一個 callback 3. callback 的值對應到頁面一定要定義一個全域性函式(為什麼是全域性?因為服務端接收到callback函式後會返回頁面中的script中去找,如果不寫在全域性作用域中根本找不到) 4. 服務端返回的是一個函式的呼叫。呼叫的時候會吧資料作為引數包在這個函式裡面。

CORS - Cross-origin resource sharing(跨域資源共享)

CORS需要瀏覽器和伺服器同時支援。 跨域資源共享 CORS 詳解

CORS與JSONP比較

CORS與JSONP的使用目的相同,但是比JSONP更強大。 JSONP只支援GET請求,CORS支援所有型別的HTTP請求。JSONP的優勢在於支援老式瀏覽器,以及可以向不支援CORS的網站請求資料

參考

WEB安全 https://tsejx.github.io/javascript-guidebook/computer-networks/web-security/xss

Content Security Policy 入門教程 http://www.ruanyifeng.com/blog/2016/09/csp.html

又一次運維,惡意 js 指令碼注入訪問偽隨機域名 https://www.lovelucy.info/malicious-javascripts-injection-and-random-domains.html

Cross-site scripting(跨站指令碼攻擊) https://developer.mozilla.org/zh-CN/docs/Glossary/Cross-site_scripting

web安全之XSS攻擊原理及防範 https://www.cnblogs.com/tugenhua0707/p/10909284.html#_labe0

瀏覽器非機器人檢測 https://bot.sannysoft.com/

前端常見跨域解決方案(全) https://segmentfault.com/a/1190000011145364?utm_source=tag-newest#articleHeader1