Web 應用中存在不少安全風險,這些風險會被黑客利用,輕則篡改網頁內容,重則竊取網站內部數據,更爲嚴重的則是在網頁中植入惡意代碼,使得用戶受到侵害。常見的安全漏洞以下:javascript
XSS
的防範XSS(cross-site scripting跨域腳本攻擊)攻擊是最多見的 Web 攻擊,其重點是『跨域』和『客戶端執行』。php
@4型 富文本
XSS 攻擊通常分爲兩類:html
Stored XSS(存儲型的 XSS 攻擊)前端
主要是url帶上參數,發送給別人,能夠轉成短網址java
反射型的 XSS 攻擊,主要是因爲服務端接收到客戶端的不安全輸入,在客戶端觸發執行從而發起 Web 攻擊。好比:node
在某購物網站搜索物品,搜索結果會顯示搜索的關鍵詞。搜索關鍵詞填入<script>alert('handsome boy')</script>
, 點擊搜索。頁面沒有對關鍵詞進行過濾,這段代碼就會直接在頁面上執行,彈出 alert。web
基於存儲的 XSS 攻擊,是經過提交帶有惡意腳本的內容存儲在服務器上,當其餘人看到這些內容時發起 Web 攻擊。通常提交的內容都是經過一些富文本編輯器編輯的,很容易插入危險代碼。ajax
JSONP 的 callback 參數很是危險,他有兩種風險可能致使 XSS算法
一、callback 參數意外截斷js代碼,特殊字符單引號雙引號,換行符均存在風險。sql
二、callback 參數惡意添加標籤(如 <script>
),形成 XSS 漏洞。
有兩種態度能夠選擇:第一種是前置過濾,即將用戶全部數據都進行轉義, 在輸出時候在前端(模板渲染)層面直接輸出。 第二種是用戶輸入的數據不通過轉義就直接存儲起來,前端在使用時候保證對數據進行轉義。
const cheerio = require('cheerio'); const fs = require('fs'); const html = fs.readFileSync('./html.html', 'utf8'); const $ = cheerio.load(html); const whiteList = { 'img': ['src'] } console.log($.html()); $('*').each((index, elem) => { if (!whiteList[elem.name]) { $(elem).remove(); return; } for(let attr in elem.attribs) { if (whiteList[elem.name].indexOf(attr) === -1){ $(elem).attr(attr, null) } } }) console.log('d', $.html());
W3C 的 Content Security Policy,簡稱 CSP,主要是用來定義頁面能夠加載哪些資源,減小 XSS 的發生。
CSP 的實質就是白名單制度,開發者明確告訴客戶端,哪些外部資源能夠加載和執行,等同於提供白名單。它的實現和執行所有由瀏覽器完成,開發者只需提供配置。
請列舉不能的狀況?
用戶除了上傳 <script>alert('xss');</script> 還可使用圖片 url 等方式來上傳腳本進行攻擊 <table background="javascript:alert(/xss/)"></table> <img src="javascript:alert('xss')"> 還能夠經過各類編碼轉換 (URL 編碼, Unicode 編碼, HTML 編碼, ESCAPE 等) 來繞過檢查 <img%20src=%22javascript:alert('xss');%22> <img src="javascript:alert(/xss/)">
CSRF(Cross-site request forgery跨站請求僞造,也被稱爲 One Click Attack
或者 Session Riding
,一般縮寫爲 CSRF 或者 XSRF,是一種對網站的惡意利用。
CSRF 攻擊會對網站發起惡意僞造的請求,嚴重影響網站的安全。所以框架內置了 CSRF 防範方案。
完成業務請求
qq遊戲利用q幣買東西
一般來講,對於 CSRF 攻擊有一些通用的防範方案,簡單的介紹幾種經常使用的防範方案:
X-Requested-With: XMLHttpRequest
)的請求。這個方案能夠被繞過,因此 rails 和 django 等框架都放棄了該防範方式。在同步渲染頁面時,在表單請求中增長一個 name 爲 _csrf
的 url query,值爲 ctx.csrf
,這樣用戶在提交這個表單的時候會將 CSRF token 提交上來:
在 CSRF 默認配置下,token 會被設置在 Cookie 中,在 AJAX 請求的時候,能夠從 Cookie 中取到 token,放置到 query、body 或者 header 中發送給服務端。
In jQuery:
var csrftoken = Cookies.get('csrfToken'); function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader('x-csrf-token', csrftoken); } }, });
默認配置下,框架會將 CSRF token 存在 Cookie 中,以方便 AJAX 請求獲取到。可是全部的子域名均可以設置 Cookie,所以當咱們的應用處於沒法保證全部的子域名都受控的狀況下,存放在 Cookie 中可能有被 CSRF 攻擊的風險。框架提供了一個配置項,能夠將 token 存放到 Session 中。
當 CSRF token 存儲在 Cookie 中時,一旦在同一個瀏覽器上發生用戶切換,新登錄的用戶將會依舊使用舊的 token(以前用戶使用的),這會帶來必定的安全風險,所以在每次用戶登錄的時候都必須刷新 CSRF token。
同源策略
same-site
存儲登陸的憑證
簽名防篡改
私有變換(加密)
http-only
secure
same-site
用戶親手操做,可是用戶不知情,從而盜取用戶資金(轉帳消費)、獲取用戶信息
網頁iframe要操做的網頁,而後把目標網站透明的設爲0,讓點擊按鍵與攻擊者設計的背景設置成一止
其餘輔助手段比較添加驗證碼等
重定向
HTTP 是網絡應用普遍使用的協議,負責 Web 內容的請求和獲取。然而,內容請求和獲取時會通過許多中間人,主要是網絡環節,充當內容入口的瀏覽器、路由器廠商、WIFI提供商、通訊運營商,若是使用了代理、FQ軟件則會引入更多中間人。因爲 HTTP 請求的路徑、參數默認狀況下均是明文的,所以這些中間人能夠對 HTTP 請求進行監控、劫持、阻擋。
在沒有 HTTPS 時,運營商可在用戶發起請求時直接跳轉到某個廣告,或者直接改變搜索結果插入自家的廣告。若是劫持代碼出現了 BUG ,則直接讓用戶沒法使用,出現白屏。
數據泄露、請求劫持、內容篡改等等問題,核心緣由就在於 HTTP 是全裸式的明文請求,域名、路徑和參數都被中間人們看得一清二楚。HTTPS 作的就是給請求加密,讓其對用戶更加安全。對於自身而言除了保障用戶利益外,還可避免本屬於本身的流量被挾持,以保護自身利益。
儘管 HTTPS 並不是絕對安全,掌握根證書的機構、掌握加密算法的組織一樣能夠進行中間人形式的攻擊。不過HTTPS是現行架構下最安全的解決方案,而且它大幅增長了中間人攻擊的成本。
密碼的做用
密碼的存儲
密碼的傳輸
密碼的替代方案
生物特徵密碼的問題
密碼傳輸的安全性
注入攻擊是指當所執行的一些操做中有部分由用戶傳入時, 用戶能夠將其惡意邏輯注入到操做中. 當你使用 eval, new Function 等方式執行的字符串中有用戶輸入的部分時, 就可能被注入攻擊. 上文中的 XSS 就屬於一種注入攻擊. 前面的章節中也提到過 Node.js 的 child_process.exec 因爲調用 bash 解析, 若是執行的命令中有部分屬於用戶輸入, 也可能被注入攻擊。
防治手段
上傳文件,再次訪問上傳的文件,上傳的文件被當成程序解析(nodejs基本不存在,php等其餘的會有問題)
oauth 能夠
1. TCP半鏈接 1. HTTP鏈接 1. DNS
請求被攔截或者被竊聽,而後被攻擊者利用,從新發送