2013-05-28 64 views
1

我在遇到以下問題時遇到了問題:非完整IP地址和ip2long()

「以下代碼的輸出是什麼?」

echo long2ip(ip2long("127.0.255")); 

正確答案是:「127.0.255.0」。

雖然這種行爲在php manual中提到,並且在german manual中甚至有一個例子,但我有我的問題重現它。

我的代碼將產生以下輸出:

echo ip2long("127.0.255"); // outputs: FALSE 
echo long2ip(ip2long("127.0.255")); //outputs: 0.0.0.0 

我上具有以下軟件版本測試了這個機器:

  • PHP 5.3.3-7 + squeeze15用了Suhosin貼片
  • 了Suhosin補丁0.9.9.1

沒有一位同事能給我一個確切的解釋。 我們唯一的假設是,它可能與Suhosin-Patch發生衝突。

如果你有一個解釋,請讓我知道。

+0

我不跑Suhosin,而且我有和你一樣的輸出 - '0.0.0.0'。版本是PHP 5.4.14。 –

回答

1

PHP手冊還規定(http://de1.php.net/manual/en/function.ip2long.php):

更新日誌

版本說明

5.2.10在此之前的版本,ip2long()有時會返回即使通過一個有效的數字該值不是(IPv4)互聯網協議虛線地址。

因此,當您使用的是比5.2.9更新的版本時,它不再工作。

更新:但它也許會工作在某些系統上依賴的ip2long功能inet_addr C函數不是C標準的一部分:每個系統都可能有自己實現它。其中一些實現具有無效IP地址的回退模式。你不應該依賴這個,因爲大部分unix衍生品都沒有這樣的後備。

+0

是的,我讀過這個。但描述仍然提到:「ip2long()也可以處理非完整的IP地址。」 – tobyte

+0

@tobyte這是一個依賴於系統的實現;不要依賴這個。 – bwoebi

+0

似乎是這樣。但是這個問題沒有特別的答案,而且我的學習材料中的問題是錯誤的。 – tobyte

1

如果您使用ip2long進行IP驗證,我建議您改用filter_var($ip, FILTER_VALIDATE_IP

PHP filter validation

+0

ip2long驗證工作太,你只需要檢查!==假...(雖然它是推薦的方式) – bwoebi

+0

我實際上並不想使用此代碼進行驗證,這只是我學習資料中的一個問題。 – tobyte

+0

@bwoebi除了5.2.10之前的ip2long可以驗證一個無效的IP,就像你在回答中顯示的那樣 - 'false === ip2long('1.2.3')'將在5.2.10之前驗證爲正確的IP – StampyCode