Angular9 XSRF 防護(hù)

2020-07-06 15:54 更新

跨站請(qǐng)求偽造 (XSRF 或 CSRF)是一個(gè)攻擊技術(shù),它能讓攻擊者假冒一個(gè)已認(rèn)證的用戶在你的網(wǎng)站上執(zhí)行未知的操作。HttpClient 支持一種通用的機(jī)制來(lái)防范 XSRF 攻擊。當(dāng)執(zhí)行 HTTP 請(qǐng)求時(shí),一個(gè)攔截器會(huì)從 cookie 中讀取 XSRF 令牌(默認(rèn)名字為 XSRF-TOKEN),并且把它設(shè)置為一個(gè) HTTP 頭 X-XSRF-TOKEN,由于只有運(yùn)行在你自己的域名下的代碼才能讀取這個(gè) cookie,因此后端可以確認(rèn)這個(gè) HTTP 請(qǐng)求真的來(lái)自你的客戶端應(yīng)用,而不是攻擊者。

默認(rèn)情況下,攔截器會(huì)在所有的修改型請(qǐng)求中(比如 POST 等)把這個(gè)請(qǐng)求頭發(fā)送給使用相對(duì) URL 的請(qǐng)求。但不會(huì)在 GET/HEAD 請(qǐng)求中發(fā)送,也不會(huì)發(fā)送給使用絕對(duì) URL 的請(qǐng)求。

要獲得這種優(yōu)點(diǎn),你的服務(wù)器需要在頁(yè)面加載或首個(gè) GET 請(qǐng)求中把一個(gè)名叫 XSRF-TOKEN 的令牌寫入可被 JavaScript 讀到的會(huì)話 cookie 中。 而在后續(xù)的請(qǐng)求中,服務(wù)器可以驗(yàn)證這個(gè) cookie 是否與 HTTP 頭 X-XSRF-TOKEN 的值一致,以確保只有運(yùn)行在你自己域名下的代碼才能發(fā)起這個(gè)請(qǐng)求。這個(gè)令牌必須對(duì)每個(gè)用戶都是唯一的,并且必須能被服務(wù)器驗(yàn)證,因此不能由客戶端自己生成令牌。把這個(gè)令牌設(shè)置為你的站點(diǎn)認(rèn)證信息并且加了鹽(salt)的摘要,以提升安全性。

為了防止多個(gè) Angular 應(yīng)用共享同一個(gè)域名或子域時(shí)出現(xiàn)沖突,要給每個(gè)應(yīng)用分配一個(gè)唯一的 cookie 名稱。

注:

HttpClient 支持的只是 XSRF 防護(hù)方案的客戶端這一半。 你的后端服務(wù)必須配置為給頁(yè)面設(shè)置 cookie,并且要驗(yàn)證請(qǐng)求頭,以確保全都是合法的請(qǐng)求。如果不這么做,就會(huì)導(dǎo)致 Angular 的默認(rèn)防護(hù)措施失效。

配置自定義 cookie/header 名稱

如果你的后端服務(wù)中對(duì) XSRF 令牌的 cookie 或 頭使用了不一樣的名字,就要使用 HttpClientXsrfModule.withConfig() 來(lái)覆蓋掉默認(rèn)值。

imports: [
  HttpClientModule,
  HttpClientXsrfModule.withOptions({
    cookieName: 'My-Xsrf-Cookie',
    headerName: 'My-Xsrf-Header',
  }),
],
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)