2012-03-11 35 views
3

我正在用PHP編寫代碼,我想檢測客戶端的IP地址。 我一直在使用$ _SERVER ['REMOTE_ADDR']。做瀏覽器保護用戶IP地址嗎?

它通常工作...但有時我得到的地址是127.255.255.255,當明確是一個普通的互聯網連接的用戶試圖連接網站。這是有原因的嗎?

+0

你在運行什麼web服務器? – 2012-03-11 13:16:37

+0

我其實不確定,我正在使用webhubhosting.com。 – user1255714 2012-03-11 13:29:21

+1

你應該檢查他們是否使用代理或其他什麼東西,爲什麼你會得到廣播地址(127.255.255.255)作爲客戶端的遠程地址。正如這裏的另一位用戶所說,REMOTE_ADDR變量是由web服務器設置的,該服務器使用從其接收請求的IP地址來運行您的PHP腳本。 – 2012-03-11 13:33:29

回答

3

127.255.255.255是你內部服務器(迴環)廣播

如果您確信這是一個外部用戶,您應該檢查您的網站code injection可能性。

+0

但爲什麼它可以在某些地址上運行,而其他地址則不能運行?真奇怪。 – user1255714 2012-03-11 13:29:39

+0

你使用'[P]'標誌在'.htaccess'文件中有任何RewriteRules嗎?你可能會自己代理一些頁面? – 2012-03-11 13:38:36

0

回答標題中的問題: REMOTE_ADDR由相應的網絡服務器設置,不能被用戶修改(除了使用代理等)。它是在任何HTTP發生之前根據傳入的TCP連接確定的。

但是,它可能會被服務器網絡中的某些防火牆或代理混淆。

另外令人困惑的是,127.255.255.255是一個廣播地址,不應該是HTTP連接(它是TCP,它只是單播)的源。

0

問題不在於你正在尋找的地方。實際上,當您使用inet_aton在mysql中存儲$_SERVER['REMOTE_ADDR']時,您必須確保該列被定義爲int (11) unsigned

如果您的列是有符號的int,那麼數據會被截斷,並且所有大於127.255.255.255的IP地址將被保存。

你需要運行在你的MySQL表此查詢(更改表和列名):

ALTER TABLE `stats` CHANGE `ip` `ip` INT(11) UNSIGNED; 
1

的問題是,ip2long會返回一個數字大到4294967295(爲255.255.255.255)和您的INT MySQL字段(如果已簽名)接受最大值2147483647(來源:http://dev.mysql.com/doc/refman/5.0/en/integer-types.html),因此任何高於2147483647的值都將被存儲爲2147483647.這就是爲什麼您的數據庫中有很多127.255.255.255的原因。我想你的數據庫列轉換爲BIGINT或無符號INT將解決這個問題,但請注意,ip2long()的某些實現(我認爲它是32位與64位)將返回一個負數,小心。

相關問題