用php能獲取客戶端ip,這個大家都知道,**如下:
/**
* 獲取客戶端ip
// ip位址合法驗證
$long = sprintf("%u",ip2long($ip));
$ip = $long ? array($ip, $long) : array('0.0.0.0', 0);
return $ip[$type];
}
雖然這個非常非常的簡單,但是php本就是伺服器端語言,為什麼它能夠獲取客戶端ip.這其實是一件神奇的事,至少我和我的小夥伴們驚呆了.
無論什麼語言,伺服器端按照理論來說,都應該獲取不到客戶端ip,無論是c++,erlang,或者其他.
有人可能認為c++不是可以獲取客戶端ip嗎?
是的,的確可以,但是那個是c++寫的客戶端程式才可以,如果c++寫的伺服器端程式,還可以嗎?
群裡有人說:這個ip的獲取是由於包傳送的時候,同時帶有ip,mac位址,所以自然就知道了.
我不這樣認為,因為理論上來說,包傳送的時候的確帶上了ip位址,也帶上了mac位址,但是從資料報的角度來解釋的話,一般都是在區域網內部傳輸時才會包上mac頭,經過路由不斷**,實際上每經過一級裝置都被剝去一層,到最後就只剩下tcp/ip的資料頭和資料了。mac只可能是在網路底層的物理層中傳輸。(也就是說client的mac位址資訊是不可能在公網上傳輸的,公網上的mac資訊是最後一跳裝置的介面mac
http是應用層協議,因此,到應用層的時候都是資料,根本就不可能還包含ip位址,mac位址...
之後分析$_server變數,這個變數裡包含了很多客戶端和伺服器的一些資訊.並且包括使用的web伺服器,之後查詢資料得出:
php能獲取客戶端ip位址的原因是,$_server變數是從伺服器那邊獲取的,也就是說:
真正獲取客戶端ip的是web伺服器,比如:apache,nginx.
然後在由web伺服器把$_server變數傳遞給php.
本著分析到底的心態,我進行一次實驗,抓包軟體進行捕捉
捕捉如下:
很容易看得出,這裡是底層的包,抓出來的ip位址也不在應用層,因此,這部分的ip,mac到應用層就已經沒了
但是下乙個包如下:
這個包是資料報,到了應用層仍然是在的,這裡可以看出資料報中帶有host然後傳遞給了web伺服器,之後在由web伺服器傳遞給php
其他小夥伴是否還有真相?歡迎拍磚
PHP獲取客戶端IP
在php獲取客戶端ip中常使用 server remote addr 但如果客戶端是使用 伺服器來訪問,那取到的是 伺服器的 ip 位址,而不是真正的客戶端 ip 位址。要想透過 伺服器取得客戶端的真實 ip 位址,就要使用 server http x forwarded for 來讀取。但只有客戶...
PHP獲取客戶端IP
在這篇文章中,我們將會為大家詳細介紹php獲取客戶端ip的幾種情況分析。我們在使用php獲取的ip可能是客戶端真實的ip,也可能是 伺服器的ip,也有可能根本取不到任何ip值。在php獲取客戶端ip中常使用 server remote addr 但如果客戶端是使用 伺服器來訪問,那取到的是 伺服器的...
php獲取客戶端IP
方法1 function get real ip 多重 伺服器下的客戶端真實ip位址 可能偽造 如果沒有使用 此字段為空 客戶端ip 或 最後乙個 伺服器 ip return ip ip server remote addr 方法2 獲取客戶端ip位址 param integer type 返回型別...