最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java之獲取客戶端真實IP地址的實現(xiàn)

 更新時間:2023年12月11日 09:00:22   作者:王廷云的博客  
在開發(fā)工作中,我們常常需要獲取客戶端的IP,本文主要介紹了Jav之獲取客戶端真實IP地址的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下

一、應用場景

  • 在投票系統(tǒng)開發(fā)中,為了防止刷票,我們需要限制每個 IP 地址只能投票一次;
  • 當網(wǎng)站受到諸如 DDoS(Distributed Denial of Service,分布式拒絕服務攻擊)等攻擊時,我們需要快速定位攻擊者 IP;
  • 在滲透測試過程中,經(jīng)常會碰到網(wǎng)站有 CDN(Content Distribution Network,內容交付網(wǎng)絡),這時我們需要繞過 CDN 查找真實 IP;

二、獲取客戶端的 IP 地址

服務端獲取客戶端請求IP地址,常見的包括:remote_addr、x-forwarded-for、client-ip 等請求頭參數(shù):

  • remote_addr:指的是當前直接請求的客戶端IP地址,它存在于tcp請求體中,是http協(xié)議傳輸?shù)臅r候自動添加,不受請求頭header的控制。因此,當客戶端與服務器之間不存在任何代理的時候,通過remote_addr獲取客戶端IP地址是最準確,也是最安全。remote_addr無法偽造
  • x-forwarded-for,即XFF,是很多代理服務器在請求轉發(fā)時添加上去的。如果客戶端和服務器之間存在代理服務器,那么通過remote_addr獲取的IP就是代理服務器的地址,并不是客戶端真實的IP地址。因此,需要代理服務器(通常是反向代理服務器)將真實客戶端的IP地址轉發(fā)給服務器,轉發(fā)時客戶端的真實IP地址通常就存在于XFF請求頭中。
  • client-ip:同XFF,也是代理服務器添加的用于轉發(fā)客戶端請求的真實IP地址,同樣保存與請求頭中。

在 Java 中,獲取客戶端 IP 最直接的方式就是使用 request.getRemoteAddr()。這種方式在中間沒有代理的情況下,獲取連接到服務器的客戶端 IP 的最簡單有效的方式。

但是目前互聯(lián)網(wǎng) Web 應用很少會將應用服務器直接對外提供服務,一般都會有一層 Nginx 做反向代理和負載均衡,有的甚至可能有多層代理。所以,在有反向代理的情況下,直接使用 request.getRemoteAddr() 獲取到的IP地址是Nginx所在服務器的IP地址,而不是客戶端的 IP。

為了解決上面的問題,很多 HTTP 代理會在 HTTP 協(xié)議頭中添加 X-Forwarded-For 頭,用來追蹤請求的來源,X-Forwarded-For 的格式如下:

X-Forwarded-For: client1, proxy1, proxy2

X-Forwarded-For 包含多個 IP 地址,每個值通過逗號+空格分開,最左邊(client1)是最原始客戶端的IP地址,中間如果有多層代理,每一層代理會將連接它的客戶端IP追加在 X-Forwarded-For 右邊。

下面就是一種常用的獲取客戶端真實IP的方法:

public static String getRealIP(HttpServletRequest request) {
    String ip = request.getHeader("X-Forwarded-For");
    if (ip != null) {
    	ip = ip.contains(",") ? ip.split(",")[0] : ip;
    } else {
	    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
	        ip = request.getHeader("Proxy-Client-IP");
	    }
	    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
	        ip = request.getHeader("WL-Proxy-Client-IP");
	    }
	    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
	        ip = request.getRemoteAddr();
	    }
    }
    return ip;
}

注意,要讓 Nginx 支持 X-Forwarded-For 頭,需要配置:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

$proxy_add_x_forwarded_for 會將和 Nginx 直接連接的客戶端 IP 追加在請求原有 X-Forwarded-Fo r值的右邊。

三、IP 偽造及解決方案

1、客戶端可以偽造 X-Forwarded-For

一般的客戶端(例如瀏覽器)發(fā)送HTTP請求是沒有 X-Forwarded-For 頭的,當請求到達第一個代理服務器時,代理服務器會加上 X-Forwarded-For 請求頭,并將值設為客戶端的IP地址(也就是最左邊第一個值),后面如果還有多個代理,會依次將IP追加到 X-Forwarded-For 頭最右邊,最終請求到達Web應用服務器,應用通過獲取 X-Forwarded-For 頭取左邊第一個IP即為客戶端真實IP。

但是如果客戶端在發(fā)起請求時,請求頭上帶上一個偽造的 X-Forwarded-For,由于后續(xù)每層代理只會追加而不會覆蓋,那么最終到達應用服務器時,獲取的左邊第一個IP地址將會是客戶端偽造的 IP。

2、解決方案:配置 Nginx 反向代理

在直接對外的Nginx反向代理服務器上配置:

proxy_set_header X-Forwarded-For $remote_addr;

如果有多層Nginx代理,內層的Nginx配置:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

在最外層 Nginx(即直接對外提供服務的Nginx)使用 $remote_addrb代替上面的 $proxy_add_x_forwarded_for,可以防止偽造 X-Forwarded-For。$proxy_add_x_forwarded_forb會在原有 X-Forwarded-For 上追加IP,這就相當于給了偽造 X-Forwarded-Fo r的機會。而 $remote_addr 是獲取的是直接 TCP 連接的客戶端 IP,這個是無法偽造的,即使客戶端偽造也會被覆蓋掉,而不是追加。

需要注意的是:如果有多層代理,只在直接對外訪問的 Nginx 上配置 X-Forwarded-For 為 $remote_addr,內層的 Nginx 還是要配置為 $proxy_add_x_forwarded_for,不然內層的 Nginx 又會覆蓋掉客戶端的真實IP。

完成以上配置后,獲取X-Forwarded-For最左邊的IP地址即為真實的客戶端地址,且客戶端也無法偽造。

到此這篇關于Java之獲取客戶端真實IP地址的實現(xiàn)的文章就介紹到這了,更多相關Java獲取客戶端真實IP地址內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring實戰(zhàn)之獲取其他Bean的屬性值操作示例

    Spring實戰(zhàn)之獲取其他Bean的屬性值操作示例

    這篇文章主要介紹了Spring實戰(zhàn)之獲取其他Bean的屬性值操作,結合實例形式分析了Spring操作Bean屬性值的相關配置與實現(xiàn)技巧,需要的朋友可以參考下
    2019-12-12
  • java中怎么將多個音頻文件拼接合成一個

    java中怎么將多個音頻文件拼接合成一個

    在Java中,將多個音頻文件拼接成一個通常需要使用一些專門的音頻處理庫,因為Java標準庫并不直接支持音頻文件的合并,一個常用的庫是JAVE2(Java?Audio?Video?Encoder)或JLayer(用于MP3)結合JavaFX(如果用于簡單的WAV文件)或其他類似的庫
    2024-06-06
  • Java 順序表專題解讀

    Java 順序表專題解讀

    順序表,全名順序存儲結構,是線性表的一種。線性表用于存儲邏輯關系為“一對一”的數(shù)據(jù),順序表自然也不例外,不僅如此,順序表對數(shù)據(jù)物理存儲結構也有要求。順序表存儲數(shù)據(jù)時,會提前申請一整塊足夠大小的物理空間,然后將數(shù)據(jù)依次存儲起來,存儲時數(shù)據(jù)元素間不留縫隙
    2021-11-11
  • Java 判斷實體對象及所有屬性是否為空的操作

    Java 判斷實體對象及所有屬性是否為空的操作

    這篇文章主要介紹了Java 判斷實體對象及所有屬性是否為空的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Java并發(fā)系列之CountDownLatch源碼分析

    Java并發(fā)系列之CountDownLatch源碼分析

    這篇文章主要為大家詳細介紹了Java并發(fā)系列之CountDownLatch源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Java創(chuàng)建對象(顯式創(chuàng)建和隱含創(chuàng)建)

    Java創(chuàng)建對象(顯式創(chuàng)建和隱含創(chuàng)建)

    本文詳細介紹對象的創(chuàng)建,在 Java 語言中創(chuàng)建對象分顯式創(chuàng)建與隱含創(chuàng)建兩種情況,顯式創(chuàng)建和隱含創(chuàng)建,,需要的朋友可以參考下面文章的具體內容
    2021-09-09
  • 使用Pinyin4j進行拼音分詞的方法

    使用Pinyin4j進行拼音分詞的方法

    下面小編就為大家分享一篇使用Pinyin4j進行拼音分詞的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Java Adapter 適配器模式(類適配器,對象適配器)優(yōu)缺點對比

    Java Adapter 適配器模式(類適配器,對象適配器)優(yōu)缺點對比

    這篇文章主要介紹了Java 適配器模式(類適配器,對象適配器)優(yōu)缺點對比的相關資料,java 適配器在基礎知識中還是比較重要的,這里就說下如何使用,需要的朋友可以參考下
    2016-12-12
  • SpringBoot實現(xiàn)圖片防盜鏈功能

    SpringBoot實現(xiàn)圖片防盜鏈功能

    出于安全考慮,我們需要后端返回的圖片只允許在某個網(wǎng)站內展示,不想被爬蟲拿到圖片地址后被下載,或者,不想瀏覽器直接訪問圖片鏈接,所以本文將給大家介紹SpringBoot實現(xiàn)圖片防盜鏈功能,需要的朋友可以參考下
    2024-04-04
  • java創(chuàng)建子類對象設置并調用父類的變量操作

    java創(chuàng)建子類對象設置并調用父類的變量操作

    這篇文章主要介紹了java創(chuàng)建子類對象設置并調用父類的變量操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評論

广东省| 凌海市| 庆云县| 克什克腾旗| 北安市| 双峰县| 贺兰县| 灌阳县| 通渭县| 孙吴县| 天津市| 普兰店市| 闸北区| 永丰县| 长宁区| 平原县| 吉林省| 阿图什市| 武邑县| 曲阳县| 乌兰察布市| 榆社县| 越西县| 拉孜县| 长岛县| 古浪县| 吴忠市| 茶陵县| 公安县| 富裕县| 吉林省| 通城县| 双江| 麦盖提县| 瑞昌市| 库伦旗| 城固县| 溆浦县| 汉中市| 邓州市| 卢龙县|