どうしてサーバーサイドでアクセス元IPを取得できるのか調べるスレ(PHPの$_SERVER['REMOTE_ADDR']とか)
初歩的すぎる疑問なのだがふと思ったので。
PHPでは、$_SERVER['REMOTE_ADDR']でアクセス元のIPアドレスを取得できる。
PHPに限らず、Webサーバーであったり、その他の言語でもおそらく同等のことはできるはず。少なくともnginxではできる。
で、これがどこから引っ張ってきているの?という疑問である。
当然ながら、HTTPヘッダに付与しているX-FORWARDEDなんちゃらを信用していては、偽造される仕組みであることは明白であるし、なんらかのプロトコルによって守られているのでは、と仮説立てた。
十中八九過去に知ったことのある内容だと思うんだが・・・
この記事がわかりやすい
digとかセッション層とかうんぬんの話はスルーするとして、この辺の文章に要注目
OSI 参照モデルでは、同一層間の通信を「プロトコル」と呼び、上下階層との通信を「インターフェイス」と呼んでいる。上位層に位置している L5-L7 は通信と言うよりサービスの実装に近いので、各層のプロトコルヘッダを持っていない事も多いが、通信そのものともいえる L2-L4 の下位層では各層のプロトコルヘッダを持っており、各層でプロトコルヘッダに基づいた処理をした後にプロトコルヘッダの取り付けと取り外しをしている。
各層の視点では、自分が処理するプロトコルヘッダより後ろは上位層に引き渡すデータと言う事になる。
IPヘッダの付与が怪しそうなので、IPヘッダについて調べてみる
IPは論理アドレス(IPアドレス)を各ノードに割り当てることで、各ノードを識別することができます。
このIPアドレスの宛先を確認することで、あるノードから別のノードへデータを送信することができます。
IPアドレスの宛先情報についてはIPヘッダに含まれています。それではこのIPヘッダを見ていきましょう。
IPヘッダには「32ビット(4byte)で構成された、送信元のIPアドレスの情報」が含まれている。要するに、IPの上で通信するのであれば、ソースのIPアドレスは必ず相手に届いているというわけだ。
さて、これでサーバーサイドでアクセス元IPがプロトコルの仕組みの上で受信できることは分かったとして、PHPはどうやってこれを環境変数に入れているのか?となる。
この辺を見たがさっぱりわからない
当たり前だけどTCPヘッダにはIPアドレスの情報は含まれていないので、IPヘッダから取得できている、で間違いは無さそう
普通にC言語の世界に迷い込んでしまった。
php_stream_xport_recvfrom関数とかにremote_addrって書いてあるから怪しい、くらいの根拠しかなくて辛い