本文章總結 https://github.com/thedaviddias/Front-End-Checklist
內部,非原創性內容。javascript
設置方式以下:
max-age 表示在該有效時間內應該使用 https 訪問,includeSubDomains 表示該域名的全部子域名適用於該策略,preload 表示預加載時不會使用 http 連接。
三個參數必須都設置才更安全。
示例:php
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
地址:https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheetcss
在任意地方使用 TLS 或其餘更強的加密服務 (Use TLS or Other Strong Transport Everywhere)
內部網絡也可被黑客攻擊到,登陸頁必須使用 HTTPS,不然表單和 session 都有被盜取的可能
不支持 TLS 的服務 SEO 權重會下降前端
涉及安全的頁面必須使用 TLS(Do Not Provide Non-TLS Pages for Secure Content)java
TLS 下不要混用非 TLS 內容(Do Not Mix TLS and Non-TLS Content)
非 TLS 內容可被篡改nginx
cookie 使用 secure 標識( Use "Secure" Cookie Flag)
設置 httpOnly 能夠禁止頁面訪問該 cookie,設置 secure 能夠設置 cookie 只在 https 下傳輸git
Cache-Control: no-cache, no-store" "Expires: 0"
使用 Strict-Transport-Security (Use HTTP Strict Transport Security)
確保用戶不會訪問 HTTP 頁面github
Pinning 技術(Use Public Key Pinning)
地址: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinningweb
這一部分主要是講使用雙向驗證的方式來解決掉中間人攻擊的問題。簡單來講就是客戶端存儲服務端的 public key,
經過驗證服務端下發的公鑰和當前存儲的公鑰是否相同,或者 hash 值是否相同。這種方式可使用自簽發證書,不須要使用 ca 簽發的證書。
在客戶端中使用該技術比較多, web 端一樣可使用:ajax
Public-Key-Pins: max-age=2592000; pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g="; pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ="; report-uri="http://example.com/pkp-report"
設置 key 的 hash 值,在指定的過時時間以前,服務端使用的 public key hash 不會變化,不然不該該信任。
使用加密更強的 key 和安全存儲(Use Strong Keys & Protect Them)
目前安全最低位爲 2048 位
使用包含當前必須域名的證書(Use a Certificate That Supports Required Domain Names)
使用一致的域名或主機名,不要使用過時證書。有多域名,須要證書中指定多域名,即Subject Alternate Names (SANs)
使用正確的名稱(Use Fully Qualified Names in Certificates)
不要使用 localhost 或者 ip 或者 www 等
不要使用通配符證書(Do Not Use Wildcard Certificates)
不要使用 RFC 1918 地址(Do Not Use RFC 1918 Addresses in Certificates)
好比:192.168/16, 172.16/12, and 10/8.
根據用戶基數設計合適的證書認證方式(Use an Appropriate Certification Authority for the Application's User Base)
內部應用可以使用內部證書,全部用戶應該安裝該證書,其餘狀況請使用公用證書服務商,他們的證書已經內置於當前應用中。
不容許使用自簽發證書
請提供全部須要的證書(Always Provide All Needed Certificates)
證書必須可被回溯到信任的根證書。證書路徑可有多級,因此須要證書提供到根證書以前的全部證書
SHA1 證書已廢棄(Be aware of and have a plan for the SHA-1 deprecation plan)
僅支持強協議(Only Support Strong Protocols)
儘可能提供支持 TLS 1.1 和 TLS 1.2 的
使用短暫密鑰(Prefer Ephemeral Key Exchanges)
只支持強加密算法(Only Support Strong Cryptographic Ciphers)
(Support TLS-PSK and TLS-SRP for Mutual Authentication)
只支持安全的從新協商(Only Support Secure Renegotiations)
禁用壓縮(Disable Compression)
更新加密庫(Update your Crypto Libraries)
web 服務是由瀏覽器進行認證的,不受應用控制。其餘狀況下須要進行配置:
EV 證書(Extended Validation Certificates),目的是的費用是合法的實體,給用戶更多的保證,注意,它自己不提供更好的加密方式,
只是增長用戶信心
客戶端證書,也就是「雙向 TLS」,即服務端一樣須要驗證客戶端的身份,因爲證書生成複雜,分發安全性,客戶端配置,證書吊銷和重發行,
這類證書用法只在高價值的鏈接且用戶量比較少的場景
證書和公鑰的 pinning(Certificate and Public Key Pinning)。Pinning 是將 host(好比服務器)和認證內容(證書或者公鑰),
應用對已經存在的關係進行認證。意思是若是從服務端下載的證書和本地存在的證書不匹配,不創建鏈接。一般在 Hybrid 和Native 應用中使用。
而 web 瀏覽器的應用沒法實現。
最後後端服務也須要進行加密,包括內網服務。
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet
簡單翻譯下:跨域請求僞造,一個惡意的網站、郵件、博客或者實時信息,經過瀏覽器針對信任的網站發起請求(用戶已登陸狀況下)。
須要保護的內容包括:
CSRF 保護總結:建議使用基於 token 減小 CSRF 攻擊。在高度敏感操做中,使用交互式保護,使用二次認證或者一次性 TOKEN。
深度防禦參照後面
相關文章見:https://seclab.stanford.edu/websec/csrf/csrf.pdf
注:須要使用強加密或者 HMAC 方法,推薦使用 AES256-GCM 或者 SHA256/512 方式
嚴格的加密 KEY 輪換和 token 生命週期策略
有兩個步驟:1. 驗證請求來源(source origin. 可經過 Origin/Referer header),2. 驗證請求要去哪裏(target origin)。之全部使用標準字段,是由於使用 javascript 的 XSS 攻擊沒法修改這兩個字段(forbidden headers,只能由瀏覽器設置)。
一般狀況下驗證 header 沒有問題,但特殊狀況下可能不存在該 headers。好比
Referer 也一樣有問題,部分狀況下會被省略,同時負載均衡、代理、嵌入式設置也會因隱私的緣由移除該字段。
因此要使用驗證須要先觀察一段時間,而後將例外添加至代碼中。該方式有兩個問題:依賴於瀏覽器行爲,須要更新規則,同時存在 XSS 攻擊時,防範效果有限。
再次提交 cookie 策略(Double Submit Cookie)
若是不方便使用 csrf token,可使用該方式,經過比較請求帶的隨機值和 cookie 中隨機值是否相等來判斷。該方式基於用戶沒法讀取 cookie 或者修改該 cookie 值,在跨域狀況下也會出現寫 cookie 的狀況,好比寫 cookie 能夠指定爲父域,則該域下的 cookie 都不安全,或者中間人攻擊將 https 轉換爲 http。因此使用該方式要保證子域都安全,且只接受 HTTPS 請求。該方式的另外一種變體是 header 中帶有 加密的 token,請求中再帶該 token。
同站 Cookie 屬性(SameSite Cookie Attribute)
由 google 提出,阻止瀏覽器跨域發送 cookie。設置以下:
Set-Cookie: JSESSIONID=xxxxx; SameSite=Strict Set-Cookie: JSESSIONID=xxxxx; SameSite=Lax
瀏覽器全局生效,但要注意,該技術目前處於草案狀態,實現的並不徹底。不推薦做爲主要的防護方式
使用自定義請求頭(Use of Custom Request Headers)
自定義請求頭則只限於同域,在跨域時須要服務端指定其餘攜帶的 Headers。該方式可保護 ajax 請求,不能保護 form 請求,跨域 CORS 設置
用戶交互式防護(User Interaction Based CSRF Defense)
用戶交互式會更爲方便,好比使用僅限於高度敏感的場景
登陸 SCRF(Login CSRF)
登陸頁面也會產生 CSRF 攻擊,在用戶已經登陸的狀況下,防範方式是未登陸前產生一個pre-session(可以使用以上三種技術)
其餘:三次提交驗證,使用 content-type 的 pre-flight
本文地址: https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
攻擊方式: Strored, Reflected 和 DOM XSS。
Stored: 將注入攻擊腳本存儲在目標服務器上,好比數據庫,消息論壇,訪客日誌,評論等,受害者從服務器獲取存儲的信息時獲得了惡意腳本, 爲 Type-I 攻擊
Reflected: 反射攻擊的腳本不在 web 服務器上,主要是在錯誤提示,搜索結果,或者其餘返回信息有一部分輸入。反射攻擊在其餘路由上,好比郵件或者其餘網站,當用戶點惡意連接,提交了釣魚表單或者只是瀏覽了惡意站點,惡意代碼會被帶到受攻擊的網站。Type-II 攻擊
DOM XSS 會在後面講到。
注意,請使用已經成熟的一些庫來實現,避免遺漏。一般實現 rule2 和3 便可知足大部分狀況的需求。
{ background-url : "javascript:alert(1)"; } // and all other URLs { text-size: "expression(alert('XSS'))"; } // only in IE
其餘預防方式
Content-Security-Policy: default-src: 'self'; script-src: 'self' static.domain.tld
總結請參考 https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
數據類型 | 上下文 | 樣例 | 防護方式 |
---|---|---|---|
String | HTML Body | <span>UNTRUSTED DATA</span> |
HTML 實體轉義 |
String | 安全的 HTML 屬性 | <input type="text" name="fname" value="UNTRUSTED DATA"> |
1. 侵入式轉換爲 > 256 爲&#xHH; 格式. 2. 只在安全白名單內的屬性添加不信任的數據 3. 針對不安全的屬性如 background,id , name 進行嚴格驗證 |
String | GET 參數 | <a href="/site/search?value=UNTRUSTED DATA">clickme</a> |
使用 %HH 格式對 GET 中參數進行轉義 |
String | src 或 href 中不受信任的 URL | <a href="UNTRUSTED URL">clickme</a> <iframe src="UNTRUSTED URL" /> |
1. 規範化輸入 2. URL 驗證 3. 安全 URL 覈實 4. 只使用安全白名單內的 HTTP 或 HTTPS 地址,避免使用 JS 協議打開新窗口 5. 屬性轉義 |
String | Css 值 | <div style="width: UNTRUSTED DATA;">Selection</div> |
1. 使用嚴格的結構驗證 2. CSS 16進制轉義 3. 設計良好的 CSS 特性 |
String | javascript 變量 | <script>var currentValue='UNTRUSTED DATA';</script> <script>someFunction('UNTRUSTED DATA');</script> |
1. 確保 js 變量使用引號起起來 2. js 16 進制轉義 3. js Unicode 轉義 4. 避免 \" ,\' ,\\ 的轉義 |
HTML | HTML Body | <div>UNTRUSTED HTML</div> |
對 HTML 的標籤等進行驗證 |
String | DOM XSS | <script>document.write("UNTRUSTED INPUT: " + document.location.hash);<script/> |
參見 DOM 的 XSS 攻擊 |
DOM XSS 和 stored reflected 攻擊的主要區別在於應用中攻擊注入的位置。 relected 和 stored 都是服務端注入,而 DOM 注入則是客戶端注入。XSS 攻擊老是在客戶端執行的。本部分中HTML 等攻擊都是由 Javascript 執行的,因此稱爲子上下文。
本部分摘自: https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet
防範規則
XSS 攻擊難防範是因爲攻擊面廣且瀏覽器之間有差別。下面是推薦實踐:
document.createElement("xx")
, element.setAttribute()
, element.appendChild
等來構建動態的界面eval
的函數, 好比 setTimeout等。轉義的正確方式是服務轉換外部的的數據,客戶端只轉義子上下文好比 dom 方法的數據。evel
來解析 JSON 對象推薦的轉義庫:esapi, Apache Commons String Utils,Jtidy, 其餘本身公司的實現
最後,innerText 在某些標籤下仍舊可被執行,火狐也不支持該方法。
主要是爲了阻止 Chrome 和 IE 對服務端返回的類型進行文本 mime 類型嗅探。
減小在上傳或下載文件時因爲用戶設置其餘名稱會致使文件後綴變爲其餘類型,好比可執行文件。
即設置 X-Content-Type-Options
爲 nosniff
, 好比nginx
add_header X-Content-Type-Options "nosniff" always;
保護用戶避免點擊劫持, 主要指浮層或者連接篡改。該信息能夠設置爲 DENY(代表當前站點不能夠被 iframe 嵌入) 或者 SAMEORIGIN(同一來源),ALLOW-FROM https://e.com
指定站點
nginx 設置:
add_header X-Frame-Options "SAMEORIGIN" always;
該屬性表示網站內容如何載入且在哪裏容許載入,也能夠用於解決點擊劫持的問題。
這個屬性可設置內容比較多,解決一些 CSRF,XSS 問題。 CSP 設置決定哪些內容是屬於白名單以內的。
Content-Security-Policy: script-src 'self'
參見:https://content-security-policy.com/
該屬性可保護的內容包括:
default-src: 全部資源可容許的路徑,主要是用於 fallback script-src: 定義 script 可被執行的來源 object-src: 定義能夠加載插件的的來源, 針對<object>, <embed> or <applet> style-src: 定義css 來源 Img-src: 圖片來源 media-src: 定義 video 和 audio 加載 來源 frame-src: 定義哪一個來源能夠加載 frame frame-ancestors: 可引用當前頁面的配置,設置爲 none 幾乎等同於 X-Frame-Options: DENY font-src: 定義寶體來源 connect-src: 哪一個來源能夠加載 script 接口,針對的是 AJAX WEBSOCKET 和 EventSource form-action: 哪一個來源能夠用於加載form 元素 sandbox: 哪一個來源使用沙盒 script-none: script 元素加載哪一個形式的的腳本 plugin-types: reflected-xss: report-uri: 報告衝突的網址,即策略攔截的後上報地址
Content-Security-Policy: default-src https:
容許加載 https 任何域
Content-Security-Policy: default-src https://scotthelme.co.uk:443
限定了加載地址
Content-Security-Policy: default-src https://scotthelme.co.uk:*
可任意端口
none
阻止加載此類資源
self
只加載當前來源
unsafe-inline
容許使用行內的 js 和 css
unsafe-eval
容許使用 eval
CSP 包含的內容仍是比較多,使用的時候建議去閱讀原文