質問

PHPの$_SERVER["REMOTE_ADDR"]によって返されたデータをDBフィールドに格納したいのですが、本当に簡単なタスクです。問題は、IPv6アドレスのテキスト表現の最大長に関する適切な情報が見つからないことです。これは、Webサーバーが<=>を通じて提供するものです。

テキスト表現をアドレスが通常エンコードされる128ビットに変換することに興味はありません。<=>によって返されるIPv6アドレスを保存するために必要な最大文字数を知りたいだけです。

役に立ちましたか?

解決

45文字

アドレスは次のようになります

0000:0000:0000:0000:0000:0000:0000:0000
  

8 * 4 + 7 = 39

4桁の8つのグループとその間に7つの:

ただし、 IPv4-mapped IPv6アドレスがある場合、最後の2つのグループは、ベース= 10で.で区切って記述できます。たとえば、 [::ffff:192.168.100.228]。完全に記述:

0000:0000:0000:0000:0000:ffff:192.168.100.228
  

(6 * 4 + 5)+ 1 +(4 * 3 + 3)= 29 + 1 + 15 = 45

注、これは入力/表示規則です-まだ128ビットのアドレスであり、ストレージではおそらく生のコロン区切り形式、つまり[0000:0000:0000:0000:0000:ffff:c0a8:64e4]上記のアドレスで標準化するのが最善でしょう。

他のヒント

Linuxでは、定数INET6_ADDRSTRLEN<arpa/inet.h>を含む、man inet_ntopを参照)を参照してください。私のシステム(ヘッダー<!> quot; in.h <!> quot;):

#define INET6_ADDRSTRLEN 46

最後の文字は、私が信じているようにNULLを終了するためのものであるため、他の答えとして、最大長は45です。

自分の質問に答えました:

  

IPv6アドレスは通常、4つの16進数の8つのグループとして書き込まれ、各グループはコロン(:)で区切られます。

つまり、最大39文字です。

このリンクの@Deepakの回答は、正解に近いと思います。 クライアントIPアドレスの最大長。したがって、正しいサイズは39ではなく45です。フィールドサイズを調べようとすることもありますが、十分なストレージサイズを用意する方が良いようです。

標準のipv6アドレスは最大で45文字ですが、ipv6アドレスには終了%の後に<!> quot; scope <!> quot;を含めることもできます。または<!> quot; zone <!> quot;文字列。固定長ではありませんが、通常は小さな正の整数またはネットワークインターフェイス名であるため、実際には45文字を超える場合があります。ネットワークインターフェイス名は通常<!> quot; eth0 <!> quot;、<!> quot; eth1 <!> quot;、<!> quot; wlan0 <!> quot;であるため、制限として50を選択するのが適切です。

単一のIPアドレスを含むように見えるHTTP_X_FORWARDED_FORなどの特定のヘッダーに注意してください。実際には複数のアドレスが含まれている可能性があります(プロキシのチェーン)。

カンマ区切り-合計で45文字を超える場合があります。DBに保存する前に確認してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top