HTTP 請求頭中的 X-Forwarded-For(XFF)

在Java代碼實踐中,有兩種方式可以從HTTP請求中獲得請求者的IP地址。一個是從Remote Address中獲得,另一個是從X-Forward-For中獲得,但他們的安全性和使用場景各有不同。一旦用錯,就可能爲系統造成漏洞。因此,需要開發者對這兩個參數深入的理解。

Remote Address代表的是當前HTTP請求的遠程地址,即HTTP請求的源地址。HTTP協議在三次握手時使用的就是這個Remote Address地址,在發送響應報文時也是使用這個Remote Address地址。因此,如果請求者僞造Remote Address地址,他將無法收到HTTP的響應報文,此時僞造沒有任何意義。這也就使得Remote Address默認具有防篡改的功能。

在一些大型網站中,來自用戶的HTTP請求會經過反向代理服務器的轉發,此時,服務器收到的Remote Address地址就是反向代理服務器的地址。在這樣的情況下,用戶的真實IP地址將被丟失,因此有了HTTP擴展頭部X-Forward-For。當反向代理服務器轉發用戶的HTTP請求時,需要將用戶的真實IP地址寫入到X-Forward-For中,以便後端服務能夠使用。由於X-Forward-For是可修改的,所以X-Forward-For中的地址在某種程度上不可信。

所以,在進行與安全有關的操作時,只能通過Remote Address獲取用戶的IP地址,不能相信任何請求頭。

當然,在使用nginx等反向代理服務器的時候,是必須使用X-Forward-For來獲取用戶IP地址的(此時Remote Address是nginx的地址),因爲此時X-Forward-For中的地址是由nginx寫入的,而nginx是可信任的。不過此時要注意,要禁止web對外提供服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章