5

$_SERVER['REMOTE_ADDR]、、、$_SERVER['HTTP_X_FORWARDED_FOR']およびによって提供されるIPアドレスに依存する機能を備えたプロジェクトがたくさんあり$_SERVER['CLIENT_IP']ます。

IPV4アドレスは、常に同じ形式で受信されるため、簡単に一致させることができます。先頭に0がなく、ドットで区切られた4つの整数.です。

一方、IPV6アドレスは圧縮できます。例:FF01:0:0:0:0:0:0:101-> FF01 :: 101

私はこの問題を調査してきましたが、関連するものは何も見つかりませんでしたので、あなたの経験をお願いします。$_SERVER['REMOTE_ADDR]標準を使用していますか?常に圧縮または非圧縮として受信されると想定しても安全ですか?

または、テストを試みる前に、すべてのIPV6文字列を圧縮する必要がありますか?

ノート:

理想的には、データベース/ソースコードの可読性を向上させ、IP範囲のマッチングを容易にするために、IPV6アドレスをバイナリ構造ではなく文字列として処理したいと思います。

4

3 に答える 3

5

最初に使用inet_pton()し、次にそれを文字列に変換し直すinet_ntop()場合は、一貫した文字列表現が必要です。一貫性を保つために入力に依存することはありません...

于 2012-04-25T15:42:50.657 に答える
2

CGI仕様は、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アドレスを拡張するのはどうですか?

この質問は以前に尋ねられたものであり、PEARを含むいくつかの解決策があります

お役に立てれば!

于 2012-04-25T15:39:05.610 に答える
1

IPv6アドレスの推奨フォーマットはRFC5952にあります。

ただし、すべてのアドレスがその形式であることに依存することはできません。文字列形式は、範囲の比較には特にひどいものです。RFCを読むと、同じIPv6アドレスを合法的に表現できる方法がいくつあるかがわかります。

実際には、アドレスを解析し(inet_pton他の場所で説明されているように)、結果の128ビットフィールドで範囲比較を実行する必要があります。

long多くの場合、ほとんどのアーキテクチャにうまく適合する64の最上位ビットのみを気にします。

于 2012-04-25T15:37:20.713 に答える