国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java開(kāi)發(fā)】之獲取客戶端真實(shí) IP 地址

這篇具有很好參考價(jià)值的文章主要介紹了【Java開(kāi)發(fā)】之獲取客戶端真實(shí) IP 地址。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、應(yīng)用場(chǎng)景


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

二、獲取客戶端的 IP 地址


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

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

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

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

為了解決上面的問(wèn)題,很多 HTTP 代理會(huì)在 HTTP 協(xié)議頭中添加 X-Forwarded-For 頭,用來(lái)追蹤請(qǐng)求的來(lái)源,X-Forwarded-For 的格式如下:

X-Forwarded-For: client1, proxy1, proxy2

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

下面就是一種常用的獲取客戶端真實(shí)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 會(huì)將和 Nginx 直接連接的客戶端 IP 追加在請(qǐng)求原有 X-Forwarded-Fo r值的右邊。

三、IP 偽造及解決方案


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

一般的客戶端(例如瀏覽器)發(fā)送HTTP請(qǐng)求是沒(méi)有 X-Forwarded-For 頭的,當(dāng)請(qǐng)求到達(dá)第一個(gè)代理服務(wù)器時(shí),代理服務(wù)器會(huì)加上 X-Forwarded-For 請(qǐng)求頭,并將值設(shè)為客戶端的IP地址(也就是最左邊第一個(gè)值),后面如果還有多個(gè)代理,會(huì)依次將IP追加到 X-Forwarded-For 頭最右邊,最終請(qǐng)求到達(dá)Web應(yīng)用服務(wù)器,應(yīng)用通過(guò)獲取 X-Forwarded-For 頭取左邊第一個(gè)IP即為客戶端真實(shí)IP。

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

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

在直接對(duì)外的Nginx反向代理服務(wù)器上配置:

proxy_set_header X-Forwarded-For $remote_addr;

如果有多層Nginx代理,內(nèi)層的Nginx配置:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

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

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

完成以上配置后,獲取X-Forwarded-For最左邊的IP地址即為真實(shí)的客戶端地址,且客戶端也無(wú)法偽造。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-758288.html

到了這里,關(guān)于【Java開(kāi)發(fā)】之獲取客戶端真實(shí) IP 地址的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java WebSocket 獲取客戶端 IP 地址

    在開(kāi)發(fā) Web 應(yīng)用程序時(shí),我們通常需要獲取客戶端的 IP 地址用于日志記錄、身份驗(yàn)證、限制訪問(wèn)等操作。當(dāng)使用 WebSocket 協(xié)議時(shí),我們可以使用 Java WebSocket API 來(lái)獲取客戶端的 IP 地址。 本文將介紹如何使用 Java WebSocket API 獲取客戶端 IP 地址,以及如何在常見(jiàn)的 WebSocket 框架中

    2024年02月05日
    瀏覽(25)
  • nginx獲取客戶端真實(shí)ip

    在nginx中獲取客戶端真實(shí)IP的方法有多種,以下是其中兩種常用的方法: 使用nginx的access_log模塊記錄請(qǐng)求日志,并在日志中包含客戶端的真實(shí)IP信息。例如: 在上述配置中,通過(guò)使用http_x_forwarded_for字段來(lái)獲取客戶端的真實(shí)IP地址。如果該字段不存在或不合法,則使用remote_ad

    2024年02月16日
    瀏覽(48)
  • kubernetes獲取客戶端真實(shí)ip

    kubernetes獲取客戶端真實(shí)ip

    大部分的業(yè)務(wù)場(chǎng)景都需要獲取客戶端的ip來(lái)審計(jì)或采取措施,文章從nodeport暴露方式獲取真實(shí)ip到ingress-nginx獲取真實(shí)ip 初學(xué)者用k8s創(chuàng)建時(shí)暴露方式一般采用nodeport,這樣方式暴露導(dǎo)致應(yīng)用負(fù)載和訪問(wèn)者并不是同一段網(wǎng)絡(luò),當(dāng)web服務(wù)獲取客戶端ip的時(shí)候會(huì)發(fā)現(xiàn)獲取到的ip是k8s網(wǎng)關(guān)的

    2024年02月01日
    瀏覽(21)
  • 獲取客戶端真實(shí)IP的方法

    獲取客戶端真實(shí)IP的方法

    獲取請(qǐng)求的IP很簡(jiǎn)單,可以直接使用request.getRemoteAddr()直接獲取。但由于請(qǐng)求在轉(zhuǎn)發(fā)到接口前,會(huì)經(jīng)過(guò)大量的反向代理,例如流程圖中,至少要經(jīng)過(guò)Nginx后,請(qǐng)求才會(huì)轉(zhuǎn)發(fā)到接口,因此需要對(duì)請(qǐng)求接口的IP做處理,提取客戶端真實(shí)IP地址。 配置Nginx的配置文件,需要反向代理服務(wù)

    2024年02月16日
    瀏覽(22)
  • nginx 獲取客戶端真實(shí)IP

    網(wǎng)站接入Web應(yīng)用防火墻WAF(Web Application Firewall)后,訪問(wèn)請(qǐng)求在到達(dá)源站服務(wù)器之前,需要經(jīng)過(guò)WAF的代理轉(zhuǎn)發(fā)。這種情況下,源站服務(wù)器可以通過(guò)解析回源請(qǐng)求中的X-Forwarded-For記錄,獲取客戶端的真實(shí)IP。 WAF在將客戶端的訪問(wèn)請(qǐng)求轉(zhuǎn)發(fā)到下一環(huán)節(jié)的服務(wù)器時(shí),會(huì)在HTTP的請(qǐng)求頭

    2023年04月09日
    瀏覽(34)
  • k8s ingress獲取客戶端客戶端真實(shí)IP

    k8s ingress獲取客戶端客戶端真實(shí)IP

    在Kubernetes中,獲取客戶端真實(shí)IP地址是一個(gè)常見(jiàn)需求。這是因?yàn)樵谪?fù)載均衡架構(gòu)中,原始請(qǐng)求的源IP地址會(huì)被替換成負(fù)載均衡器的IP地址。 獲取客戶端真實(shí)IP的需求背景包括以下幾點(diǎn): 安全性:基于客戶端IP進(jìn)行訪問(wèn)控制和認(rèn)證授權(quán)可以提高系統(tǒng)安全性。 日志記錄與審計(jì):記

    2024年02月13日
    瀏覽(24)
  • Nginx(二十) 獲取真實(shí)客戶端IP

    ????????客戶端在訪問(wèn)互聯(lián)網(wǎng)應(yīng)用服務(wù)器時(shí),與真實(shí)的應(yīng)用服務(wù)器之間會(huì)因?yàn)橛卸鄬臃聪虼?,而?dǎo)致真實(shí)應(yīng)用服務(wù)器獲取的僅是最近一層的反向代理服務(wù)器 IP。為使 Nginx 后端的上游服務(wù)器可以獲得真實(shí)客戶端 IP,Nginx 提供了 ngx_http_realip_module 模塊用以實(shí)現(xiàn)真實(shí)客戶端

    2024年01月16日
    瀏覽(31)
  • nginx如何獲取真實(shí)客戶端ip

    nginx作為反向代理服務(wù)器,即代理我們的服務(wù)端,下面介紹下如何配置nginx獲取真實(shí)的客戶端ip 1、配置nginx.con 2、在java程序中可以通過(guò)如下方式獲?。?這樣就可以打印出真實(shí)ip了!即request.getHeader(\\\"X-Real-IP\\\")的值 引用: 查看端口占用及釋放所占用的端口_查詢谷歌瀏覽器的端口

    2024年02月11日
    瀏覽(16)
  • Java編程技巧:獲取ip地址、通過(guò)ip獲取地理位置、獲取客戶端操作系統(tǒng)、獲取客戶端瀏覽器、獲取主機(jī)名、獲取操作系統(tǒng)、獲取系統(tǒng)架構(gòu)

    說(shuō)明: 大家直接去對(duì)應(yīng)項(xiàng)目位置找到代碼,然后看著復(fù)制就行了 1.1、若依(自己寫(xiě)的代碼) 項(xiàng)目:https://gitee.com/y_project/RuoYi 子模塊:ruoyi-common 所在類:com.ruoyi.common.utils.IpUtils 所在方法:getIpAddr 詳細(xì)位置:整個(gè)方法 1.2、Snowy(借助hutool工具包) 項(xiàng)目:https://gitee.com/xiaonuo

    2024年02月04日
    瀏覽(235)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包