2011-06-25 69 views
5

假設php通過cgi/mod_php/etc等以web模式運行...

是否可以安全地假設$ _SERVER ['REMOTE_ADDR']將存在,並且更進一步說,它將包含正確的程式化(對不起,術語可能在這裏......)ip(1.1.1.1 - > 255.255.255.255?)?

這不是一個有關天氣的問題,$ _SERVER ['REMOTE_ADDR']中包含的ip將是發出請求的客戶端的真實IP地址,因爲我明白這可以通過修改出站tcp來'欺騙'包...

只是簡單:

一)將$ _ SERVER [ 'REMOTE_ADDR']如果PHP是在網絡模式下運行始終存在。 b)如果$ _SERVER ['REMOTE_ADDR']總是存在,它是否總是包含正確的語法IP?

謝謝。

+0

好問題 - 我認爲這兩個問題的答案都是「是」,但我對[IPV6](http://en.wikipedia.org/wiki/IPV6)並不完全確定。出於好奇,你爲什麼需要知道?如果它不是*格式正確的IP,你會在哪一點遇到麻煩? –

+0

剛剛通過已運行(運行良好)多年的代碼,但已通過以下驗證此信息: isset($ _ SERVER ....)+ ^([1-9] | [1-9] [0-9] | 1 [0-9] [0-9] | 2 [0-4] [0-9] | 25 [0-5])(\([0-9] |。[1- 9] [0-9] | 1 [0-9] [0-9] | 2 [0-4] [0-9] | 25 [0-5])){3}^ 這似乎是完全不必要 –

+0

儘可能符合ipv6 ...在運行此代碼的盒子上禁用了ipv6,所以在那個前端沒問題(暫時)...再次感謝! –

回答

6

是的,它總是以網頁模式出現,並且由於IP地址從二進制表示轉換爲您所看到的文本格式,所以它始終有效–無法指定IP地址中的無效IP IP標頭。

還有一件事:除非你絕對必須處理IP地址,否則不要採取任何特殊格式。例如,IPv6地址較長且包含不同的字符。基本上,處理IP地址是一個不透明的字符串。

+0

非常感謝你! –

+0

我知道這已經過了一年多了。但是,我運行一個使用ip2long的服務器來將關於每次訪問的信息存儲在數據庫中。我的代碼是'$ ip = ip2long($ _ SERVER ['REMOTE_ADDR'])',我發現$ ip等於0.爲什麼會發生這種情況? – Kayla

+0

沒關係我的最後一條評論。我的數據庫不接受負數。 **請注意,ip2long可以返回一個負值。** – Kayla