我正在用PHP編寫代碼,我想檢測客戶端的IP地址。 我一直在使用$ _SERVER ['REMOTE_ADDR']。做瀏覽器保護用戶IP地址嗎?
它通常工作...但有時我得到的地址是127.255.255.255,當明確是一個普通的互聯網連接的用戶試圖連接網站。這是有原因的嗎?
我正在用PHP編寫代碼,我想檢測客戶端的IP地址。 我一直在使用$ _SERVER ['REMOTE_ADDR']。做瀏覽器保護用戶IP地址嗎?
它通常工作...但有時我得到的地址是127.255.255.255,當明確是一個普通的互聯網連接的用戶試圖連接網站。這是有原因的嗎?
127.255.255.255
是你內部服務器(迴環)廣播
如果您確信這是一個外部用戶,您應該檢查您的網站code injection可能性。
但爲什麼它可以在某些地址上運行,而其他地址則不能運行?真奇怪。 – user1255714 2012-03-11 13:29:39
你使用'[P]'標誌在'.htaccess'文件中有任何RewriteRules嗎?你可能會自己代理一些頁面? – 2012-03-11 13:38:36
回答標題中的問題: REMOTE_ADDR由相應的網絡服務器設置,不能被用戶修改(除了使用代理等)。它是在任何HTTP發生之前根據傳入的TCP連接確定的。
但是,它可能會被服務器網絡中的某些防火牆或代理混淆。
另外令人困惑的是,127.255.255.255是一個廣播地址,不應該是HTTP連接(它是TCP,它只是單播)的源。
問題不在於你正在尋找的地方。實際上,當您使用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;
的問題是,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位)將返回一個負數,小心。
你在運行什麼web服務器? – 2012-03-11 13:16:37
我其實不確定,我正在使用webhubhosting.com。 – user1255714 2012-03-11 13:29:21
你應該檢查他們是否使用代理或其他什麼東西,爲什麼你會得到廣播地址(127.255.255.255)作爲客戶端的遠程地址。正如這裏的另一位用戶所說,REMOTE_ADDR變量是由web服務器設置的,該服務器使用從其接收請求的IP地址來運行您的PHP腳本。 – 2012-03-11 13:33:29