2011-11-15 458 views
10

我通過將$_SERVER['REMOTE_ADDR']的值保存在MySQL數據庫中來保存用戶的IP地址。問題是,對於Firefox和Chrome $_SERVER['REMOTE_ADDR']::1(這意味着本地主機在IPv6)和IE和Opera是127.0.0.1IPv4)。不同的瀏覽器,不同的IP?

所以,我的問題是

  • 爲IP版本瀏覽器的依賴? (我曾經認爲它取決於計算機的 )

  • 我應該在數據庫中創建兩個字段,一個用於IPv4地址,另一個用於IPv6地址?

  • 我應該統一所有的IP到IPv6嗎?我怎麼能在PHP中做到這一點(如果甚至可能)?

回答

6
  1. 相當明顯 - 啓用了IPv6的盒子,火狐/ Chrome瀏覽器使用IPv6可用時,而IE和Opera不(或它在一個關閉的情況的默認設置)。

  2. 將地址存儲在足夠長的字符串中以保存IPv6地址。

  3. 不,因爲在一般情況下你不能。

+0

但......不是IP相同,但只有在不同的表現?我的意思是,如果一個網頁在Chrome中導航時通過IP禁止我,這意味着使用Opera I進行日誌記錄可以繞過它嗎? – federicot

+2

不是。它是兩種不同的網絡傳輸,具有兩個不同的地址空間。在雙協議網絡中,您有一個IPv6地址和一個IPv4地址,這可能會或可能不會匹配,具體取決於網絡設置。 –

+1

@John Doe:理論上,是的。你有兩個不同的IP,所以阻止一個IP仍然會讓另一個通過。實際上,可能不是。有很多啓用了IPv6的站點,並且沒有提供IPv6連接的ISP沒有隧道/封裝。 –

2

使用PHP函數inet_pton將可讀取的IP地址轉換爲打包表示形式。然後,您可以將每個IP地址存儲在數據庫的BINARY(16)VARBINARY(16)字段中。

2

瀏覽器將使用任何可用的。這可以是IPv4或IPv6,甚至可以在會話期間更改。最重要的是,請記住,主機可以擁有多個IPv6地址,以便在會話期間也可以更改。

簡而言之:不依賴於REMOTE_ADDR的值設置得太大:-)

+0

有人告訴過,許多人可能會共享相同的IP等,但在這種情況下,準確性對我來說並不是特別重要,所以我會讓它滑動 – federicot

+0

@JohnDoe:這不僅僅是「極端」準確性的問題 - 許多辦公室,WiFi熱點,家庭網絡等等。 ,整個網絡只使用一個IP地址。如果您關心在同一家星巴克的不同筆記本電腦上區分兩個不同的用戶,那麼您不應該通過IP地址來識別它們。 –

+1

@JohnDoe你所提到的與我所說的完全相反:你談論使用相同IP地址的多個用戶,我說的是使用多個(IPv4和/或IPv6)地址的一個用戶。這可能是因爲某人擁有多個IPv6地址,因爲他們在具有多個公用IPv4地址的NAT444網關之後,並且因爲用戶在這些IPv4和IPv6地址之間切換。 –