成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

HTTP X-Forwarded-For 介紹

X-Forwarded-For 是一個 HTTP 擴展頭部。HTTP/1.1(RFC 2616)協議并沒有對它的定義,它最開始是由 Squid 這個緩存代理軟件引入,用來表示 HTTP 請求端真實 IP。如今它已經成為事實上的標準,被各大 HTTP 代理、負載均衡等轉發服務廣泛使用,并被寫入 RFC 7239(Forwarded HTTP Extension)標準之中。

X-Forwarded-For 請求頭格式非常簡單,就這樣:

X-Forwarded-For: client, proxy1, proxy2

可以看到,XFF 的內容由「英文逗號 + 空格」隔開的多個部分組成,最開始的是離服務端最遠的設備 IP,然后是每一級代理設備的 IP。

如果一個 HTTP 請求到達服務器之前,經過了三個代理 Proxy1、Proxy2、Proxy3,IP 分別為 IP1、IP2、IP3,用戶真實 IP 為 IP0,那么按照 XFF 標準,服務端最終會收到以下信息:

X-Forwarded-For: IP0, IP1, IP2

Proxy3 直連服務器,它會給 XFF 追加 IP2,表示它是在幫 Proxy2 轉發請求。列表中并沒有 IP3,IP3 可以在服務端通過 Remote Address 字段獲得。我們知道 HTTP 連接基于 TCP 連接,HTTP 協議中沒有 IP 的概念,Remote Address 來自 TCP 連接,表示與服務端建立 TCP 連接的設備 IP,在這個例子里就是 IP3。

Remote Address 無法偽造,因為建立 TCP 連接需要三次握手,如果偽造了源 IP,無法建立 TCP 連接,更不會有后面的 HTTP 請求。不同語言獲取 Remote Address 的方式不一樣,例如 php 是 $_SERVER[“REMOTE_ADDR”],Node.js 是 req.connection.remoteAddress,但原理都一樣。


問題

有了上面的背景知識,開始說問題。我用 Node.js 寫了一個最簡單的 Web Server 用于測試。HTTP 協議跟語言無關,這里用 Node.js 只是為了方便演示,換成任何其他語言都可以得到相同結論。另外本文用 Nginx 也是一樣的道理,如果有興趣,換成 Apache 或其他 Web Server 也一樣。

下面這段代碼會監聽 9009 端口,并在收到 HTTP 請求后,輸出一些信息:

  var http = require('http');    http.createServer(function (req, res) {      res.writeHead(200, {'Content-Type': 'text/plain'});      res.write('remoteAddress: ' + req.connection.remoteAddress + 'n');      res.write('x-forwarded-for: ' + req.headers['x-forwarded-for'] + 'n');      res.write('x-real-ip: ' + req.headers['x-real-ip'] + 'n');      res.end();  }).listen(9009, '0.0.0.0');

這段代碼除了前面介紹過的 Remote Address 和 X-Forwarded-For,還有一個 X-Real-IP,這又是一個自定義頭部字段。X-Real-IP 通常被 HTTP 代理用來表示與它產生 TCP 連接的設備 IP,這個設備可能是其他代理,也可能是真正的請求端。需要注意的是,X-Real-IP 目前并不屬于任何標準,代理和 Web 應用之間可以約定用任何自定義頭來傳遞這個信息。

現在可以用域名 + 端口號直接訪問這個 Node.js 服務,再配一個 Nginx 反向代理:

  location / {      proxy_set_header X-Real-IP $remote_addr;      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;      proxy_set_header Host $http_host;      proxy_set_header X-NginX-Proxy true;        proxy_pass http://127.0.0.1:9009/;      proxy_redirect off;  }

我的 Nginx 監聽 80 端口,所以不帶端口就可以訪問 Nginx 轉發過的服務。

測試直接訪問 Node 服務:

  curl http://t1.imququ.com:9009/    remoteAddress: 114.248.238.236  x-forwarded-for: undefined  x-real-ip: undefined

由于我的電腦直接連接了 Node.js 服務,Remote Address 就是我的 IP。同時我并未指定額外的自定義頭,所以后兩個字段都是 undefined。

再來訪問 Nginx 轉發過的服務:

  curl http://t1.imququ.com/    remoteAddress: 127.0.0.1  x-forwarded-for: 114.248.238.236  x-real-ip: 114.248.238.236

這一次,我的電腦是通過 Nginx 訪問 Node.js 服務,得到的 Remote Address 實際上是 Nginx 的本地 IP。而前面 Nginx 配置中的這兩行起作用了,為請求額外增加了兩個自定義頭:

  proxy_set_header X-Real-IP $remote_addr;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

實際上,在生產環境中部署 Web 應用,一般都采用上面第二種方式,有很多好處。但這就引入一個隱患:很多 Web 應用為了獲取用戶真正的 IP,從 HTTP 請求頭中獲取 IP。

HTTP 請求頭可以隨意構造,我們通過 curl 的 -H 參數構造 X-Forwarded-For 和 X-Real-IP,再來測試一把。

直接訪問 Node.js 服務:

  curl http://t1.imququ.com:9009/ -H 'X-Forwarded-For: 1.1.1.1' -H 'X-Real-IP: 2.2.2.2'    remoteAddress: 114.248.238.236  x-forwarded-for: 1.1.1.1  x-real-ip: 2.2.2.2

對于 Web 應用來說,X-Forwarded-For 和 X-Real-IP 就是兩個普通的請求頭,自然就不做任何處理原樣輸出了。這說明,對于直連部署方式,除了從 TCP 連接中得到的 Remote Address 之外,請求頭中攜帶的 IP 信息都不能信。

訪問 Nginx 轉發過的服務:

  curl http://t1.imququ.com/ -H 'X-Forwarded-For: 1.1.1.1' -H 'X-Real-IP: 2.2.2.2'    remoteAddress: 127.0.0.1  x-forwarded-for: 1.1.1.1, 114.248.238.236  x-real-ip: 114.248.238.236

這一次,Nginx 會在 X-Forwarded-For 后追加我的 IP;并用我的 IP 覆蓋 X-Real-IP 請求頭。這說明,有了 Nginx 的加工,X-Forwarded-For 最后一節以及 X-Real-IP 整個內容無法構造,可以用于獲取用戶 IP。

用戶 IP 往往會被使用與跟 Web 安全有關的場景上,例如檢查用戶登錄地區,基于 IP 做訪問頻率控制等等。這種場景下,確保 IP 無法構造更重要。經過前面的測試和分析,對于直接面向用戶部署的 Web 應用,必須使用從 TCP 連接中得到的 Remote Address;對于部署了 Nginx 這樣反向代理的 Web 應用,在正確配置了 Set Header 行為后,可以使用 Nginx 傳過來的 X-Real-IP 或 X-Forwarded-For 最后一節(實際上它們一定等價)。

那么,Web 應用自身如何判斷請求是直接過來,還是由可控的代理轉發來的呢?在代理轉發時增加額外的請求頭是一個辦法,但是不怎么保險,因為請求頭太容易構造了。如果一定要這么用,這個自定義頭要夠長夠罕見,還要保管好不能泄露出去。

判斷 Remote Address 是不是本地 IP 也是一種辦法,不過也不完善,因為在 Nginx 所處服務器上訪問,無論直連還是走 Nginx 代理,Remote Address 都是 127.0.0.1。這個問題還好通常可以忽略,更麻煩的是,反向代理服務器和實際的 Web 應用不一定部署在同一臺服務器上。所以更合理的做法是收集所有代理服務器 IP 列表,Web 應用拿到 Remote Address 后逐一比對來判斷是以何種方式訪問。

通常,為了簡化邏輯,生產環境會封掉通過帶端口直接訪問 Web 應用的形式,只允許通過 Nginx 來訪問。那是不是這樣就沒問題了呢?也不見得。

首先,如果用戶真的是通過代理訪問 Nginx,X-Forwarded-For 最后一節以及 X-Real-IP 得到的是代理的 IP,安全相關的場景只能用這個,但有些場景如根據 IP 顯示所在地天氣,就需要盡可能獲得用戶真實 IP,這時候 X-Forwarded-For 中第一個 IP 就可以排上用場了。這時候需要注意一個問題,還是拿之前的例子做測試:

  curl http://t1.imququ.com/ -H 'X-Forwarded-For: unknown, <>"1.1.1.1'    remoteAddress: 127.0.0.1  x-forwarded-for: unknown, <>"1.1.1.1, 114.248.238.236  x-real-ip: 114.248.238.236

X-Forwarded-For 最后一節是 Nginx 追加上去的,但之前部分都來自于 Nginx 收到的請求頭,這部分用戶輸入內容完全不可信。使用時需要格外小心,符合 IP 格式才能使用,不然容易引發 SQL 注入或 XSS 等安全漏洞。

結論

  1. 直接對外提供服務的 Web 應用,在進行與安全有關的操作時,只能通過 Remote Address 獲取 IP,不能相信任何請求頭;
  2. 使用 Nginx 等 Web Server 進行反向代理的 Web 應用,在配置正確的前提下,要用 X-Forwarded-For 最后一節 或 X-Real-IP 來獲取 IP(因為 Remote Address 得到的是 Nginx 所在服務器的內網 IP);同時還應該禁止 Web 應用直接對外提供服務;
  3. 在與安全無關的場景,例如通過 IP 顯示所在地天氣,可以從 X-Forwarded-For 靠前的位置獲取 IP,但是需要校驗 IP 格式合法性;

PS:網上有些文章建議這樣配置 Nginx,其實并不合理:

  proxy_set_header X-Real-IP $remote_addr;  proxy_set_header X-Forwarded-For $remote_addr;  

這樣配置之后,安全性確實提高了,但是也導致請求到達 Nginx 之前的所有代理信息都被抹掉,無法為真正使用代理的用戶提供更好的服務。還是應該弄明白這中間的原理,具體場景具體分析。

原文地址:https://imququ.com/post/x-forwarded-for-header-in-http.html

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
噜噜久久噜噜久久鬼88| 黑人大雞巴ⅩⅩⅩ| 国产成人无码AⅤ片在线观看导航| 久久亚洲男人第一AV网站| 性欧美VIDEO高清| 女主快穿到各个世界做小三| 欧美熟VIDEOS肥婆| 欧美日韩亚洲国产综合乱| 国产婷婷丁香五月缴情成人网| 成年轻人电影WWW无码| 国产AV一区二区三区最新精品| 国产精品无码A∨麻豆| 狠狠躁夜夜躁青青草原| 久久婷婷五月综合成人D啪| 欧美三级一区二区| 天天躁日日躁狠狠躁日日躁| 亚洲娇小与黑人巨大交| 18禁又污又黄又爽的网站不卡 | 日本黑人乱偷人妻中文字幕| 未满十八18禁止免费无码网站| 亚洲国产天堂久久综合226| 最新 国产 精品 精品 视频| 动漫精品视频一区二区三区| 含苞待放1ⅤLH花莹莹| 免费无遮挡无码永久在线观看视频| 日产乱码一二三区别视频| 亚洲AV日韩AV激情亚洲| 主人地下室惩罚骚奴的法律后果| 非洲妓女BBWBBWW| 精品国产污污免费网站| 欧美乱大交XXXXX| 无码无套少妇毛少18PXX| 一边下奶一边吃面膜视频讲解图片 | JAPAN丰满人妻VIDEOS| 国产内射老熟女AAAA∵| 免费国产无人区码卡二卡3卡 | 人人人人人人一摸| 亚洲AV无码精品色午夜蛋壳 | 亚洲乱码日产精品BD| AV免费网站在线观看| 国产毛片精选好视频| 免费天堂无码人妻成人AV电影| 四虎国产精品永久在线动漫| 野花社区日本韩国免费观看| 成熟交BGMBGMBGM日本| 巨爆乳无码视频在线观看| 少妇人妻系列1~100| 我把英语课代表按在桌子上抄| 伸进衣服里吃奶捏胸视频| 无翼乌全彩工口里番库| 中国XMXM18小孩的推荐机制| 中国熟妇毛多多裸交视频| 国产成人久久精品二区三区| 浪荡艳妇爆乳JUFD汗だく肉感| 少妇无码一区二区三区免费| 永久免费AV无码网站韩国毛片 | 欧美日韩久久中文字幕 | 色窝窝无码一区二区三区| 一本大道东京热无码AⅤ| 粉嫩小泬久久久久久久久久小说| 久久久无码精品国产一区| 图片区小说区AV区| 99国产精品无码专区| 狠狠色噜噜狠狠狠狠色综合网| 人人爽人人澡人人高潮| 亚洲夜夜欢A∨一区二区三区| 公和熄洗澡三级在线观看| 免费无遮挡毛片中文字幕| 亚洲AV无码乱码国产精品老妇| 爱情岛论坛自拍亚洲品质极速福利 | 18大禁漫画吃奶羞羞漫画| 国产精品三级AV三级AV三级 | 亚洲熟妇无码AV不卡在线播放| 成人动漫在线观看| 麻豆果冻精东九一传媒MV | 国产猛男猛女超爽免费视频| 人妻夜夜爽天天爽三区麻豆AV网| 亚洲中文字幕一区精品自拍| 国产精品视频一区二区| 人摸人人人澡人人超碰手机版| 艳妇乳肉豪妇荡乳XXX| 国产色婷婷精品综合在线| 日韩人妻无码精品二专区| 1819岁MACBOOK日本| 精品无码国产一区二区三区麻豆 | 色噜噜精品一区二区三区| 2022久久国产精品免费热麻豆| 精品国产18久久久久久| 挽起裙子迈开腿坐下去的图片高清| JAPANESEⅩⅩⅩHD69| 美女MM131爽爽爽| 亚洲乱码日产精品B在线 | 成 人片 黄 色 大 片| 男男车车CP视频| 亚洲最新版AV无码中文字幕| 好爽…又高潮了粉色视频| 无码精品人妻AV一区二区三区| 成人A毛片免费播放| 欧美性爱小说网站| 中文精品久久久久国产| 久久精品无码一区二区软件| 亚洲AV无码专区国产乱码在线观| 国产激情一区二区三区视频免樱桃 | 四虎AV永久在线精品免费观看| 爱性久久久久久久久| 欧美成人精品午夜免费影视| 正在播放熟妇群老熟妇456| 久久精品中文字幕第一页| 亚洲狠狠婷婷综合久久久久图片 | 欧美XXX性喷潮| 中文无码日韩欧免费视频| 久久久久精品一区中文字幕| 亚洲精品成人网久久久久久 | 亚洲成A人片在线观看中文| 国产精品无码专区在线播放| 天天看片高清观看免费| 儿子耕了母亲荒废的田清朝| 日本精产国品一二三产品| YYYY1111少妇影院在线观| 欧美熟妇黑人ⅩXXXXX| 99在线精品一区二区三区| 欧美成人精品视频一区二区三区| 91麻豆精品无码一区二区三区| 免费无码国产V片在线观看| 在线观看高H无码黄动漫| 乱妇乱女熟妇熟女网站| 在线观看亚洲AV每日更新无码| 快添捏我奶头我快受不了了动态图| 一边摸一边吃奶一边做爽| 老熟女重囗味HDXX70星空| 中文字幕无码成人免费视频 | 亚洲 A V无 码免 费 成| 国产尤物AV尤物在线观看| 亚洲AV无码专区在线观看漫画| 狠狠爱五月丁香亚洲综合| 亚洲精品天堂成人片AV在线播放| 精品人妻中文AV一区二区三区| 亚洲色欲一区二区三区在线观看| 久久精品亚洲精品无码| 岳故意装睡让我挺进去的电影| 蜜桃AV噜噜一区二区三区| 99视频69E精品视频| 日本插槽X8插槽怎么用的| 粉嫩粉嫩的18在线免免费观看| 天天影视色香欲综合久久| 国产无遮挡又黄又爽在线观看| 亚洲国产精彩中文乱码AV| 精品久久久久久久久中文字幕 | 欧美性猛交XXXX乱大交视频| 被黑人捅入子宫射精小说| 撕开奶罩揉吮奶头免费视频| 国产欧美日韩一区二区三区在线| 亚洲变态另类调教久久久| 久久久久国产亚洲AⅤ麻豆| 2022久久国产精品免费热麻豆| 人人妻人人爽人人澡AV| 国产成人亚洲综合网站| 亚洲爆乳WWW无码专区| 久久综合九色综合欧美| 久久亚洲国产成人精品无码区| 亚洲毛片ΑV无线播放一区| 天天躁日日躁狠狠躁婷婷| 东京热人妻系列无码专区| 无码人妻精品一区二区三区蜜桃| 国产专区一线二线三线品牌东| 亚洲色精品一区二区三AI女星| 里番本子库绅士ACG全彩无码| FREE性欧美18ⅩXOO极品| 手机看片AV永久免费| 好嗨哟片在线观看| 中国人熟女HDFREEHDXⅩ| 日本熟妇XXⅩ浓密黑毛| 国产伦理一区二区| 永久黄网站免费视频性色| 日本人XXXX1819HD| 国精产品W灬源码1688在线| 在线中文天堂最新版WWW| 日本一丰满一BBW| 含羞草传媒每天免费三次看剧| 中文亚洲AV片在线观看| 色老头BGMBGMBGM| 激情欧美成人久久综合| 97超级碰碰碰久久久久| 天天躁日日躁狠狠躁一区| 久久成人国产精品免费| 锕锕锕锕锕锕好痛WWW在线观看| 性丰满ⅩXXOOO性FREE| 美国少归BVBV| 国产成人AV综合久久视色| 夜夜揉揉日日人人| 日日日日做夜夜夜夜无码| 精品久久一区二区乱码| XOXOXO性ⅩYY欧美人与人| 亚洲AV少妇熟女猛男| 欧美精品九九99久久在免费线| 国产精品自在在线午夜| 19部MACBOOKPRO日本| 午夜理论片YY6080影院| 免费播放片高清在线视频| 国产精品夜色一区二区三区|