2012-04-25 38 views
5

$_SERVER['REMOTE_ADDR]$_SERVER['HTTP_X_FORWARDED_FOR']、および$_SERVER['CLIENT_IP']で提供されるIPアドレスに依存する機能を持つプロジェクトが多数あります。

IPV4のアドレスは、常に同じ形式で受信するため、簡単に一致します。先行する0のない4つの整数。ドットは.で区切られています。

IPV6アドレスを圧縮することができます。例:FF01:0:0:0:0:0:0:101 - > FF01 :: 101

私はこの問題を調査していますが、関連するものは見つかっていないので、あなたの経験を求めています。 $_SERVER['REMOTE_ADDR]は標準を使用していますか?それが常に圧縮されているか、圧縮されていないと受け取られると想定するのは安全でしょうか?

私はそれらをテストしようとする前に、私はすべて私のIPV6文字列を圧縮する必要がありますか?

注:

理想的には私は、データベース/ソースコードで読みやすさを改善し、より簡単にIP範囲のマッチングを可能にするために、むしろバイナリ構造よりも文字列としてIPV6アドレスを処理したいと思います。

+0

私はIPv6で作業していませんが、操作したいアドレスをinet_pton()する必要があるという印象があります。 –

+0

@ÁlvaroG.Vicarioコメントしていただきありがとうございます。私は間違いなくこの機能を調べます。しかし、私は文字列記法を可能な限り保持したいと思います。 – Tchoupi

答えて

5

最初にinet_pton()を使用してからinet_ntop()の文字列に変換すると、一貫した文字列表記が必要です。一貫性のある入力には依存しません。

+1

私はそれをテストしたところ、一貫した結果が得られたようです。これはまさに私が探しているものかもしれません。私はそれがうまくいくかどうかを見るために実際の生活プロジェクトでそれをテストするつもりです。 – Tchoupi

+0

私はテストしました、それは完全に動作します。そしてそれは十分簡単です。ありがとう! – Tchoupi

+1

@サンド[inet_pton()](http://php.net/manual/en/function.inet-pton.php)と[inet_ntop()](http://php.net/manual/en/function。 inet-ntop.php)...これらのリンクをあなたの答えに入れることができますか? –

1

IPv6アドレスのの形式がRFC 5952であることが推奨されています()。

ただし、すべてのアドレスがその形式であることに頼ることはできません。また、文字列形式は範囲比較のために特に厄介です。 RFCを読んで、同じIPv6アドレスを合法的に表現できる方法についていくつか考えてみましょう。

実際にアドレスを解析し(別のところで述べたようにinet_ptonを使用して)、結果の128ビットフィールドで範囲比較を実行する必要があります。

ほとんどのアーキテクチャでは、longにうまく収まる64の最上位ビットだけが気になることがよくあります。

1

CGI specは、任意のRFCに準拠したIPv6アドレスが有効であることは明らかである:

4.1.8. REMOTE_ADDR 

    The REMOTE_ADDR variable MUST be set to the network address of the 
    client sending the request to the server. 

     REMOTE_ADDR = hostnumber 
     hostnumber = ipv4-address | ipv6-address 
     ipv4-address = 1*3digit "." 1*3digit "." 1*3digit "." 1*3digit 
     ipv6-address = hexpart [ ":" ipv4-address ] 
     hexpart  = hexseq | ([ hexseq ] "::" [ hexseq ]) 
     hexseq  = 1*4hex *(":" 1*4hex) 

    The format of an IPv6 address is described in RFC 3513 [15]. 

まともなプログラマはすべての入力を検証します。したがって、任意の環境変数を汚染された入力として扱い、検証/変換する必要があります。 X-Forward-Forなどのクライアントが提供するヘッダーは、常に疑念を持って処理する必要があります。

IPv6アドレスを拡張するのはどうですか?

この質問はa PEAR one

含むbeen asked beforethere are several solutionsを持っているが、この情報がお役に立てば幸い!

+0

ありがとう!私はもちろんそれが有効なIPであることを最初に検証します。実際には、私はhttp://stackoverflow.com/questions/444966/working-with-ipv6-addresses-in-phpで提供されている関数を使って、IPV4とIPV6をデータベースに格納しています。 PEARソリューションは良いもののように見えますが、確かに試してみます。 – Tchoupi

+0

たとえ範囲がナイブル境界(すなわち/ 62)にならない場合、特に梨機能が、文字列形式(完全に拡張されたもの)でIPv6の範囲一致を実行しようとすると、 – Alnitak

+0

@Alnitak Goodポイント。私のIP範囲はニブル境界に減らすことができるので、一貫した入力があると仮定すると、単純な 'strpos'がそのトリックを行うべきです。 – Tchoupi

関連する問題