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安全 http://tsejx.github.io/javascript-guidebook/computer-networks/web-security/xss

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

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

Cross-site scripting(跨站腳本攻擊) http://developer.mozilla.org/zh-CN/docs/Glossary/Cross-site_scripting

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

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

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