x forwarded for的深度挖掘

2022-03-22 16:02:21 字數 3896 閱讀 7638

**:x-forwarded-for的深度挖掘

如今利用nginx做負載均衡的例項已經很多了,針對不同的應用場合,還有很多需要注意的地方,本文要說的就是在通過cdn 後到達nginx做負載均衡時請求頭中的x-forwarded-for項到底發生了什麼變化。下圖為簡單的web架構圖:

先來看一下x-forwarded-for的定義:

x-forwarded-for:簡稱xff頭,它代表客戶端,也就是http的請求端真實的ip,只有在通過了http **或者負載均衡伺服器時才會新增該項。它不是rfc中定義的標準請求頭資訊,在squid快取**伺服器開發文件中可以找到該項的詳細介紹。

標準格式如下:

x-forwarded-for: client1, proxy1, proxy2

從標準格式可以看出,

x-forwarded-for頭資訊可以有多個,中間用逗號分隔,第一項為真實的客戶端ip,剩下的就是曾經經過的**或負載均衡的ip位址,經過幾個就會出現幾個。

按照上圖的web架構圖,可以很容易的看出,當使用者請求經過cdn後到達nginx負載均衡伺服器時,其x-forwarded-for頭資訊應該為

客戶端ip,cdn的ip。但實際情況並非如此,一般情況下cdn服務商為了自身安全考慮會將這個資訊做些改動,只保留客戶端ip。我們可以通過php程式獲得

x-forwarded-for

資訊或者通過nginx的add header方法來設定返回頭來檢視。

下面來分析請求頭到達nginx負載均衡伺服器的情況;在預設情況下,nginx並不會對x-forwarded-for頭做任何的處理,除非使用者使用

proxy_set_header 引數設定:

proxy_set_header        x-forwarded-for $proxy_add_x_forwarded_for;

$proxy_add_x_forwarded_for變數包含客戶端請求頭中的"x-forwarded-for",與$remote_addr用逗號分開,如果沒有"x-forwarded-for" 請求頭,則$proxy_add_x_forwarded_for等於$remote_addr。

$remote_addr變數的值是客戶端的ip

當nginx設定x-forwarded-for等於$proxy_add_x_forwarded_for後會有兩種情況發生

1、如果從cdn過來的請求沒有設定x-forwarded-for頭(通常這種

事情不會發生),而到了我們這裡nginx設定將其設定為$proxy_add_x_forwarded_for的話,x-forwarded-for的

資訊應該為cdn的ip,因為相對於nginx負載均衡來說客戶端即為cdn,這樣的話,後端的web程式時死活也獲得不了真實使用者的ip的。

2、cdn設定了x-forwarded-for,我們這裡又設定了一次,且值為$proxy_add_x_forwarded_for的話,那麼x-forwarded-for的內容變成 」客戶端ip,nginx負載均衡伺服器ip「如果是這種情況的話,那後端的程式通過x-forwarded-for獲得客戶端ip,則取逗號分隔的第一項即可。

如上兩點所說,如果我們知道了cdn設定了x-forwarded-for資訊,且只有客戶端真實的ip的話,那麼我們的nginx負載均衡伺服器可以不必理會該頭,讓它預設即可。

其實nginx中還有乙個$http_x_forwarded_for變數,這個變數中儲存的內容就是請求中的x-forwarded-for資訊。如果後端獲得x-forwarded-for資訊的程式相容性不好的話(沒有考慮到x-forwarded-for含有多個ip的情況),最好就不要將x-forwarded-for設定為$proxy_add_x_forwarded_for。應該設定為$http_x_forwarded_for或者乾脆不設定!

參考文章:

如今利用nginx做負載均衡的例項已經很多了,針對不同的應用場合,還有很多需要注意的地方,本文要說的就是在通過cdn 後到達nginx做負載均衡時請求頭中的x-forwarded-for項到底發生了什麼變化。下圖為簡單的web架構圖:

先來看一下x-forwarded-for的定義:

x-forwarded-for:簡稱xff頭,它代表客戶端,也就是http的請求端真實的ip,只有在通過了http **或者負載均衡伺服器時才會新增該項。它不是rfc中定義的標準請求頭資訊,在squid快取**伺服器開發文件中可以找到該項的詳細介紹。

標準格式如下:

x-forwarded-for: client1, proxy1, proxy2

從標準格式可以看出,

x-forwarded-for頭資訊可以有多個,中間用逗號分隔,第一項為真實的客戶端ip,剩下的就是曾經經過的**或負載均衡的ip位址,經過幾個就會出現幾個。

按照上圖的web架構圖,可以很容易的看出,當使用者請求經過cdn後到達nginx負載均衡伺服器時,其x-forwarded-for頭資訊應該為

客戶端ip,cdn的ip。但實際情況並非如此,一般情況下cdn服務商為了自身安全考慮會將這個資訊做些改動,只保留客戶端ip。我們可以通過php程式獲得

x-forwarded-for

資訊或者通過nginx的add header方法來設定返回頭來檢視。

下面來分析請求頭到達nginx負載均衡伺服器的情況;在預設情況下,nginx並不會對x-forwarded-for頭做任何的處理,除非使用者使用

proxy_set_header 引數設定:

proxy_set_header        x-forwarded-for $proxy_add_x_forwarded_for;

$proxy_add_x_forwarded_for變數包含客戶端請求頭中的"x-forwarded-for",與$remote_addr用逗號分開,如果沒有"x-forwarded-for" 請求頭,則$proxy_add_x_forwarded_for等於$remote_addr。

$remote_addr變數的值是客戶端的ip

當nginx設定x-forwarded-for等於$proxy_add_x_forwarded_for後會有兩種情況發生

1、如果從cdn過來的請求沒有設定x-forwarded-for頭(通常這種

事情不會發生),而到了我們這裡nginx設定將其設定為$proxy_add_x_forwarded_for的話,x-forwarded-for的

資訊應該為cdn的ip,因為相對於nginx負載均衡來說客戶端即為cdn,這樣的話,後端的web程式時死活也獲得不了真實使用者的ip的。

2、cdn設定了x-forwarded-for,我們這裡又設定了一次,且值為$proxy_add_x_forwarded_for的話,那麼x-forwarded-for的內容變成 」客戶端ip,nginx負載均衡伺服器ip「如果是這種情況的話,那後端的程式通過x-forwarded-for獲得客戶端ip,則取逗號分隔的第一項即可。

如上兩點所說,如果我們知道了cdn設定了x-forwarded-for資訊,且只有客戶端真實的ip的話,那麼我們的nginx負載均衡伺服器可以不必理會該頭,讓它預設即可。

其實nginx中還有乙個$http_x_forwarded_for變數,這個變數中儲存的內容就是請求中的x-forwarded-for資訊。如果後端獲得x-forwarded-for資訊的程式相容性不好的話(沒有考慮到x-forwarded-for含有多個ip的情況),最好就不要將x-forwarded-for設定為$proxy_add_x_forwarded_for。應該設定為$http_x_forwarded_for或者乾脆不設定!

參考文章:

X Forwarded For注入漏洞

測試思路 1 登入後台提示ip資訊不正確,這種情況一般是x forwarded for讀取客戶端ip 2 通過在資料報新增x forwarded for 1.1.1.1看 respone包中是否存在1.1.1.1 3 如果存在則證明用x forwarded for讀取客戶端資料,則存在注入漏洞 4 ...

X Forwarded For 的一些理解

x forwarded for 是乙個 http 擴充套件頭部,主要是為了讓 web 伺服器獲取訪問使用者的真實 ip 位址 其實這個真實未必是真實的,後面會說到 那為什麼 web 伺服器只有通過 x forwarded for 頭才能獲取真實的 ip?x forwarded for client1...

drop,delete,truncate的深度剖析

1 delete語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中儲存以便進行進行回滾操作。truncate table 則一次性地從表中刪除所有的資料並不把單獨的刪除操作記錄記入日誌儲存,刪除行是不能恢復的。並且在刪除的過程中不會啟用與表有關的刪除觸發器。執行速度...