web-dev-qa-db-ja.com

$ _SERVER ['REMOTE_ADDR']を信頼しても安全ですか?

$_SERVER['REMOTE_ADDR']?リクエストのヘッダーなどを変更することで置き換えることができますか?

そのようなものを書くのは安全ですか?

if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address
    $grant_all_admin_rights = true;
}
81
Silver Light

はい、それは安全です。これはTCP接続のソースIPであり、HTTPヘッダーを変更して置き換えることはできません。

心配したい場合の1つは、リバースプロキシの背後にいる場合です。この場合、REMOTE_ADDRは常にプロキシサーバーのIPであり、ユーザーIPはHTTPヘッダーで提供されます( X -Forwarded-For )。ただし、通常のユースケースでは、REMOTE_ADDRの読み取りで問題ありません。

100
sagi

$_SERVER['REMOTE_ADDR']は、TCP接続が入ったIPアドレスです。インターネット上でIPアドレスを双方向でスプーフィングすることは技術的に可能ですが(BGP経由で不正なルートをアナウンスすることにより)、そのような攻撃は通常、攻撃者はISPまたはキャリアを制御する必要があります。TCP(まだ)。双方向IPスプーフィングはささいなことではありません。しかし、LAN。

また、IPv4ではなくIPv6アドレスである可能性があることに注意してください。現在のチェックはその点では問題ありませんが、それをチェックする場合は1.2.3.4のみ発生しますanywhere$_SERVER['REMOTE_ADDR']、攻撃者は単に2001:1234:5678::1.2.3.4

要するに、重要な(銀行/軍事/潜在的損害> 50.000€)アプリケーション以外の場合、ローカルネットワークの攻撃者を除外できる場合は、リモートIPアドレスを使用できます。

56
phihag

上記のように、それは絶対に安全ではありません。しかし、それはあなたがそれを使うべきではないという意味ではありません。これを、たとえばCOOKIE値の確認など、他の認証方法と組み合わせることを検討してください。

3
Audio