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