摘要:對(duì)協(xié)議進(jìn)行擴(kuò)展。通過(guò)此項(xiàng)措施,強(qiáng)行將設(shè)置為客戶端使客戶端無(wú)法通過(guò)本文所述方式偽造。
在閱讀本文前,大家要有一個(gè)概念,由于TCP需要三次握手連接,在實(shí)現(xiàn)正常的TCP/IP 雙方通信情況下,是無(wú)法偽造來(lái)源 IP 的,也就是說(shuō),在 TCP/IP 協(xié)議中,可以偽造數(shù)據(jù)包來(lái)源 IP ,但這會(huì)讓發(fā)送出去的數(shù)據(jù)包有去無(wú)回,無(wú)法實(shí)現(xiàn)正常的通信。
一些DDoS 攻擊,它們只需要不斷發(fā)送數(shù)據(jù)包,而不需要正常通信,它們就會(huì)采取這種“發(fā)射出去就不管”的行為來(lái)進(jìn)行攻擊。
那么在HTTP 中, “ 偽造來(lái)源 IP”, 又是如何造成的?如何防御之?
先搞明白后端應(yīng)用IP獲取來(lái)源
1.’REMOTE_ADDR’是遠(yuǎn)端IP,默認(rèn)來(lái)自tcp連接客戶端的Ip??梢哉f(shuō),它最準(zhǔn)確,確定是,只會(huì)得到直接連服務(wù)器客戶端IP。如果對(duì)方通過(guò)代理服務(wù)器上網(wǎng),就發(fā)現(xiàn)。獲取到的是代理服務(wù)器IP了。
如:a→b(proxy)→c ,如果c 通過(guò)’REMOTE_ADDR’ ,只能獲取到b的IP,獲取不到a的IP了。
這個(gè)值是無(wú)法修改的。
2.’HTTP_X_FORWARDED_FOR’,’HTTP_CLIENT_IP’ 為了能在大型網(wǎng)絡(luò)中,獲取到最原始用戶IP,或者代理IP地址。對(duì)HTTp協(xié)議進(jìn)行擴(kuò)展。定義了實(shí)體頭。
HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2其中的值通過(guò)一個(gè) 逗號(hào)+空格 把多個(gè)IP地址區(qū)分開(kāi), 最左邊(client1)是最原始客戶端的IP地址, 代理服務(wù)器每成功收到一個(gè)請(qǐng)求,就把請(qǐng)求來(lái)源IP地址添加到右邊。
HTTP_CLIENT_IP 在高級(jí)匿名代理中,這個(gè)代表了代理服務(wù)器IP。
其實(shí)這些變量,來(lái)自http請(qǐng)求的:X-Forwarded-For字段,以及client-ip字段。 正常代理服務(wù)器,當(dāng)然會(huì)按rfc規(guī)范來(lái)傳入這些值。
但是,攻擊者也可以直接構(gòu)造該x-forword-for值來(lái)“偽造源IP”,并且可以傳入任意格式IP.
這樣結(jié)果會(huì)帶來(lái)2大問(wèn)題,其一,如果你設(shè)置某個(gè)頁(yè)面,做IP限制。 對(duì)方可以容易修改IP不斷請(qǐng)求該頁(yè)面。 其二,這類數(shù)據(jù)你如果直接使用,將帶來(lái)SQL注冊(cè),跨站攻擊等漏洞。
這類問(wèn)題,其實(shí)很容易出現(xiàn),比如很多時(shí)候利用這個(gè)騙取大量偽裝投票。那么該如何修復(fù)呢?
在代理轉(zhuǎn)發(fā)及反向代理中經(jīng)常使用X-Forwarded-For 字段。
X-Forwarded-For(XFF)的有效性依賴于代理服務(wù)器提供的連接原始IP地址的真實(shí)性,因此, XFF的有效使用應(yīng)該保證代理服務(wù)器是可信的.
比如Nginx代理服務(wù)器,我們可以在其轉(zhuǎn)發(fā)/反向代理的時(shí)候主動(dòng)配置X-Forwarded-For為正確的值。
location / { proxy_pass ....; proxy_set_header X-Forwarded-For $remote_addr ; }
$remote_addr 是 nginx 的內(nèi)置變量,代表了客戶端真實(shí)(網(wǎng)絡(luò)傳輸層) IP 。通過(guò)此項(xiàng)措施,強(qiáng)行將 X-Forwarded-For 設(shè)置為客戶端 ip, 使客戶端無(wú)法通過(guò)本文所述方式“偽造 IP ”。
如果最前端(與用戶直接通信)代理服務(wù)器是與php fastcgi 直接通信,則需要在其上設(shè)定:
location ~ .php$ { fastcgi_pass localhost:9000; fastcgi_param HTTP_X_FORWARD_FOR $remote_addr; }
但是更常用的配置如下:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
后臺(tái)代碼,通過(guò)X-Real-IP頭來(lái)獲取客戶真實(shí)IP
參考:
http://www.cnblogs.com/chengm...
http://zhangxugg-163-com.itey...
http://blog.csdn.net/lemon_tr...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65276.html
摘要:對(duì)協(xié)議進(jìn)行擴(kuò)展。通過(guò)此項(xiàng)措施,強(qiáng)行將設(shè)置為客戶端使客戶端無(wú)法通過(guò)本文所述方式偽造。 在閱讀本文前,大家要有一個(gè)概念,由于TCP需要三次握手連接,在實(shí)現(xiàn)正常的TCP/IP 雙方通信情況下,是無(wú)法偽造來(lái)源 IP 的,也就是說(shuō),在 TCP/IP 協(xié)議中,可以偽造數(shù)據(jù)包來(lái)源 IP ,但這會(huì)讓發(fā)送出去的數(shù)據(jù)包有去無(wú)回,無(wú)法實(shí)現(xiàn)正常的通信。 一些DDoS 攻擊,它們只需要不斷發(fā)送數(shù)據(jù)包,而不需要正...
摘要:在有反向代理的情況下,直接使用獲取到的地址是所在服務(wù)器的地址,而不是客戶端的。如何防范方法一在直接對(duì)外的反向代理服務(wù)器上配置如果有多層代理,內(nèi)層的配置在最外層即直接對(duì)外提供服務(wù)的使用代替上面的,可以防止偽造。 問(wèn)題背景 在Web應(yīng)用開(kāi)發(fā)中,經(jīng)常會(huì)需要獲取客戶端IP地址。一個(gè)典型的例子就是投票系統(tǒng),為了防止刷票,需要限制每個(gè)IP地址只能投票一次。 如何獲取客戶端IP 在Java中,獲取客...
閱讀 835·2023-04-25 19:40
閱讀 3492·2023-04-25 17:41
閱讀 3007·2021-11-11 11:01
閱讀 2623·2019-08-30 15:55
閱讀 3231·2019-08-30 15:44
閱讀 1361·2019-08-29 14:07
閱讀 485·2019-08-29 11:23
閱讀 1330·2019-08-27 10:54