2012-05-16 26 views
6

私はgethostbyname()を使って、アプリケーション内のドメインのIPアドレスを取得しています。PHP:gethostbyname bug

'50.9.49 'などの無効なアドレスもチェックされることがあります。この例gethostbyname

echo gethostbyname('50.9.49'); // returns 50.9.0.49 

は、虚偽または未修正の無効なIPアドレスを返す必要があります。関数は変更されたIPアドレス50.9.0.49を返します。

phpのバグのようです。クイックフィックスは、前に無効な数値アドレスを確認するように思われる、他の提案がありますか?基盤となるOSのgethostbyname、例えば、Linuxがnetdb.hまたはWindowsのWinsock2.hからの

+0

どのバージョンのPHPですか? –

+3

私はPHPがこれが起こる唯一の場所ではないと思います。これは、Windowsで 'ping 50.9.49'を使うときにも起こります。私は応答を得る: '32.9バイトのデータを持つ50.9.0.49のPing ... ' –

+0

@Simonその場合、バグではない –

答えて

7

PHPのgethostbyname実際uses結果。これは実際にPHPではなく戻り値を生成する関数です。

/* {{{ php_gethostbyname */ 
static char *php_gethostbyname(char *name) 
{ 
    struct hostent *hp; 
    struct in_addr in; 

    hp = gethostbyname(name); 

    if (!hp || !*(hp->h_addr_list)) { 
     return estrdup(name); 
    } 

    memcpy(&in.s_addr, *(hp->h_addr_list), sizeof(in.s_addr)); 

    return estrdup(inet_ntoa(in)); 
} 
/* }}} */ 
3

これは、IPがどのように動作するかについての文書化されていない機能のようです。あなたの質問のコメントで述べたように、Windowsのping 50.9.49は実際には50.9.0.49をpingします。アドレスをa.b.dと入力すると、ca.b.0.dというゼロが自動的に挿入されます。 a.dと入力すると、2つのゼロが挿入されます:a.0.0.d

これは、Windows 7とDebian Linuxの両方でテストされています。

+1

これは実際にはそれ以上のものです.3番目の「オクテット」は16ビットの値として扱われます。 772が0x0304であるため、 '1.2.772'はあなたに' 1.2.3.4'を送ります。確かに、同じ結果を得るために 'ping 16909060'(0x01020304)することができます! – duskwuff

+1

'ping 50'はあなたに' 0.0.0.50'を与えます。 –