2011-07-16 40 views
9

localhostから管理するように設計されたサイトを構築していますが、インターネットやローカルネットワークユーザーにデータを公開するページが含まれています。 PHPの$ _SERVER ['REMOTE_ADDR']をローカルホストとしてユーザを識別するための安全で信頼できる方法として利用できますか? ありがとう!

編集: 明確にするために、私は(おそらくより良い方法がある)要求がローカルホストから発信するか否かを判断して心配です。

+0

これは確かに信頼できます。明らかにする必要はありません、わかりました;) –

答えて

10

この変数はApache(または別のWebサーバーデーモン)によって提供されるデータで満たされているため、接続の反対側のIPアドレスを信頼できるはずです。 127.x.x.x(ほぼ常に127.0.0.1)と:: 1(IPv6の場合)を確認します。 Senicaの言うとおり、常に存在するとは限りません(たとえば、Webサーバーではなくコマンドラインから実行している場合など)。しかし、それが満たされれば、それは信頼できるものでなければなりません。

これを偽造できるようにするには、誰かがすでにあなたのネットワークとシステムにかなりのアクセスを必要としています。

+0

お返事ありがとうございます。このサイトは、お客様自身のサーバーで使用するための展開用です。私は、このアプローチでは、サーバー構成全体で一貫性のない動作が発生する可能性があることを懸念しています(返品される保証はできません) – leo

+1

次に、上記で定義したチェックを行う必要があります。 REMOTE_ADDRが設定されていない場合は、HTTPリクエストとして受信されていません。その可能性はまったくありません(そしてIPチェックが存在することを知るには十分な能力を備えている必要があります)。エッジケースについては心配しないでください。 127.x.x.xと:: 1をチェックすると、すべての正常な設定をカバーしているはずです。 –

+0

私のパラノイアを楽にしてくれてありがとう。 – leo

0

いいえWebサーバによって、remote_addrが提供されているかどうかは異なります。

リトラクトTHAT。 .. HTTP_REFERERについて考えました。

それはあなたにIPアドレスを与える必要があります...はい。プロキシが存在する可能性があることを忘れないで

+0

'HTTP_REFERER'は実際にはサーバーではなくブラウザーによって異なります。 –

-1

通常、ローカルホストからの接続には適用されませんが、プロキシを考慮する必要があります。リモートエンドがHTTPプロキシを使用している場合、$_SERVER['REMOTE_ADDR']には、クライアント自体のIPアドレスではなく、そのプロキシのIPアドレスが含まれます。

それが無効になってプライバシー設定を持っているプロキシである場合は、その後、あなたは以下のコードを使用して、クライアントのIPを取得する機会を持っていることがあります。

// will be set by the proxy if no privacy is enabled: 
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
    return $_SERVER['HTTP_X_FORWARDED_FOR']; 
} else if(isset($_SERVER['REMOTE_ADDR'])) { 
    return $_SERVER['REMOTE_ADDR']; 
} 

しかし、あなたのクライアントは、プライバシーとHTTPプロキシを使用している場合有効にすると、クライアントIPを取得する機会はありません。


セキュリティヒント(感謝@deceze)あなたはHTTP_X_FORWARDED_FORヘッダに依存している場合、攻撃者が自分のIPを偽装するために、それが簡単になることに注意してください。これは他の手法でも可能ですが、HTTP_X_FORWARDED_FORヘッダーを使用すると非常に簡単になります。あなたは警告されています。しかし、とにかくWebアプリケーションはセキュリティのためにIP情報を使うべきではないので、それは単なるメモです

+0

1)「REMOTE_ADDR」の代わりにX-Forwarded-Forヘッダ*を使うと、誰にでも簡単にIPアドレスを偽装することができます。メタ情報として 'REMOTE_ADDR'に加えて*を使用している場合2)' isset &&!empty'は冗長ですが、 '!empty'はうまくいくでしょう。 – deceze

+0

@deceze多くの、なりすましのヒントのおかげで!私はこれについて考えたことはありません.... 2.)、それは正しくない、彼らは同じではありません:チェック[このフィドル](http://phpfiddle.org/lite/code/6c9-8zz) – hek2mgl

+0

私は ' isset &&!empty 'は無意味で、同じではありません。 – deceze

関連する問題