W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
一般來(lái)說(shuō)我們的服務(wù)都不會(huì)直接接受外部的請(qǐng)求,而會(huì)將服務(wù)部署在接入層之后,從而實(shí)現(xiàn)多臺(tái)機(jī)器的負(fù)載均衡和服務(wù)的平滑發(fā)布,保證高可用。
在這個(gè)場(chǎng)景下,我們無(wú)法直接獲取到真實(shí)用戶請(qǐng)求的連接,從而無(wú)法確認(rèn)用戶的真實(shí) IP,請(qǐng)求協(xié)議,甚至請(qǐng)求的域名。為了解決這個(gè)問(wèn)題,框架默認(rèn)提供了一系列配置項(xiàng)來(lái)讓開(kāi)發(fā)者配置,以便基于和接入層的約定(事實(shí)標(biāo)準(zhǔn))來(lái)讓?xiě)?yīng)用層獲取到真實(shí)的用戶請(qǐng)求信息。
通過(guò) config.proxy = true,可以打開(kāi)前置代理模式:
// config/config.default.js |
注意,開(kāi)啟此模式后,應(yīng)用就默認(rèn)自己處于反向代理之后,會(huì)支持通過(guò)解析約定的請(qǐng)求頭來(lái)獲取用戶真實(shí)的 IP,協(xié)議和域名。如果你的服務(wù)未部署在反向代理之后,請(qǐng)不要開(kāi)啟此配置,以防被惡意用戶偽造請(qǐng)求 IP 等信息。
開(kāi)啟 proxy 配置后,應(yīng)用會(huì)解析 X-Forwarded-For 請(qǐng)求頭來(lái)獲取客戶端的真實(shí) IP。如果你的前置代理通過(guò)其他的請(qǐng)求頭來(lái)傳遞該信息,可以通過(guò) config.ipHeaders 來(lái)配置,這個(gè)配置項(xiàng)支持配置多個(gè)頭(逗號(hào)分開(kāi))。
// config/config.default.js |
X-Forwarded-For 等傳遞 IP 的頭,通用的格式是:
X-Forwarded-For: client, proxy1, proxy2 |
我們可以拿第一個(gè)作為請(qǐng)求的真實(shí) IP,但是如果有惡意用戶在請(qǐng)求中傳遞了 X-Forwarded-For 參數(shù)來(lái)偽造其在反向代理之后,就會(huì)導(dǎo)致 X-Forwarded-For 拿到的值不準(zhǔn)確了,可以被用來(lái)偽造請(qǐng)求 IP 地址,突破應(yīng)用層的一些 IP 限制。
X-Forwarded-For: fake, client, proxy1, proxy2 |
為了避免此問(wèn)題,我們可以通過(guò) config.maxIpsCount 來(lái)配置前置的反向代理數(shù)量,這樣在獲取請(qǐng)求真實(shí) IP 地址時(shí),就會(huì)忽略掉用戶多傳遞的偽造 IP 地址了。例如我們將應(yīng)用部署在一個(gè)統(tǒng)一的接入層之后(例如阿里云 SLB),我們可以將此參數(shù)配置為 1,這樣用戶就無(wú)法通過(guò) X-Forwarded-For 請(qǐng)求頭來(lái)偽造 IP 地址了。
// config/config.default.js |
此配置項(xiàng)與 koa 提供的 options.maxIpsCount 作用一致。
開(kāi)啟 proxy 配置后,應(yīng)用會(huì)解析 X-Forwarded-Proto 請(qǐng)求頭來(lái)獲取客戶端的真實(shí)訪問(wèn)協(xié)議。如果你的前置代理通過(guò)其他的請(qǐng)求頭來(lái)傳遞該信息,可以通過(guò) config.protocolHeaders 來(lái)配置,這個(gè)配置項(xiàng)支持配置多個(gè)頭(逗號(hào)分開(kāi))。
// config/config.default.js |
開(kāi)啟 proxy 配置后,應(yīng)用仍然還是直接讀取 host 來(lái)獲取請(qǐng)求的域名,絕大部分反向代理并不會(huì)修改這個(gè)值。但是也許有些反向代理會(huì)通過(guò) X-Forwarded-Host 來(lái)傳遞客戶端的真實(shí)訪問(wèn)域名,可以通過(guò)在 config.hostHeaders 中配置,這個(gè)配置項(xiàng)支持配置多個(gè)頭(逗號(hào)分開(kāi))。
// config/config.default.js |
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: