HTTP中ip地址偽造的問題以及解決辦法

來源:互聯網
上載者:User

標籤:

在真實環境下,php擷取用戶端ip地址的方法通常有以下幾種:

                    (1):通過$_SERVER[ "HTTP_CLIENT_IP" ]

                    (2):通過$_SERVER[ "HTTP_X_FORWARDED_FOR" ]

                    (3):通過$_SERVER[ "REMOTE_ADDR" ]

這裡需要注意的是:在php中的$_SERVER數組中以HTTP開頭的值,都是由用戶端(client)傳遞到服務端的,也就是說這一部分是可以進行偽造的。而$_SERVER[ "REMOTE_ADDR" ]是由伺服器傳遞的,是不能進行偽造的(如果這一部分都可以偽造,那就伺服器沒有辦法傳遞資料到正確的用戶端上了)

php通過curl函數進行HTTP_CLIENT_IP以及HTTP_X_FORWARDED_FOR進行偽造:

curl_setopt( $ch , CURLOPT_HTTPHEADER , array(‘X-FORWARDED-FOR:‘.$ip, ‘CLIENT-IP:‘.$ips ) );

其中的 $_SERVER[ "HTTP_X_FORWARDED_FOR" ] 一開始我壓根不知道這是什麼,後來查了一下,總結一下:X-Forwarded-For 是一個 HTTP 擴充頭部。HTTP/1.1(RFC 2616)協議並沒有對它的定義,它最開始是由 Squid 這個緩衝代理軟體引入,用來表示 HTTP 要求端真實 IP。它的基本格式如下:X-Forwarded-For: client, proxy1, proxy2 (存在反向 Proxy以及負載平衡時會用到,這個也是可以偽造的)

在不存在反向 Proxy或負載平衡的情況下,服務端通過$_SERVER[ "REMOTE_ADDR" ]就可以擷取真實的用戶端ip地址

在存在反向 Proxy或負載平衡的情況下,服務端通過$_SERVER[ "REMOTE_ADDR" ]擷取到的並不是用戶端的ip地址,而是反向 Proxy伺服器或者散發者的ip地址(詳情看)

服務端擷取的remote_addr其實是由傳遞資料到php解析器的伺服器傳遞的,傳遞時串連伺服器的ip地址,http檔案伺服器所擷取的remote_addr就是nginx伺服器的ip地址

如何在存在反向 Proxy以及負載平衡的情況下擷取用戶端的真實的ip地址那?解決辦法如下:

在的nginx伺服器(Proxy 伺服器中)進行HTTP_X_FORWARD_FOR參數的配置,配置如下:

location ~ "\.+\.php$" {

     fastcgi_pass localhost:9000;

     fastcgi_param  HTTP_X_FORWARD_FOR  $remote_addr;

} -----nginx向php-fpm傳遞的HTTP_X_FORWARD_FOR參數是nginx擷取的真實的用戶端ip,那麼在php指令碼中直接擷取$_SERVER[ "HTTP_X_FORWARD_FOR" ]就可以擷取真實的用戶端ip地址了

 

HTTP中ip地址偽造的問題以及解決辦法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.