3

このphpスクリプトを使用して、ユーザーがIPアドレスで識別されるシステムを開発しています:

function visitorIP()
{ 
    if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
        $TheIp=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }else{
        $TheIp=$_SERVER['REMOTE_ADDR'];  
    } 

    return trim($TheIp);
}

$ip = visitorIP();

これは、IP アドレスを取得するための本当に安全な方法なのだろうか。私はクレジット カード番号やお金を扱っているわけではないので、システムが非常に安全である必要はありませんが、このスクリプトが非常に簡単にハッキングされると、とにかく問題になる可能性があります。助けてくれてありがとう。

4

4 に答える 4

2

IP を取得するために使用している方法は、Apache Web サーバーではかなり標準的ですが、REMOTE_ADDR はユーザーを一意に識別するための信頼できる方法ではありません。また、他の人が指摘しているように、「HTTP_*」ヘッダーはどれも簡単に偽装できます。

大きな問題は、IP アドレスでユーザーを識別することは単純に問題があるということです。一般に、多数のユーザーがいることが予想される大規模なシステムでは、これを行うことはありません。頭のてっぺんから、それが故障するいくつかの状況を考えることができます。

  • 一般的なルーターの背後に複数のユーザーがいるホーム ネットワーク。ルーターの背後にあるすべてのコンピューター/デバイスは、同じ IP から送信されます。
  • PHP サーバーにリクエストを転送するロード バランサーの背後にプログラムをセットアップします。REMOTE_ADDR は、ロード バランサーの IP になります。
  • プロキシ サービスを経由するユーザーはすべて、プロキシ サーバーと同じ IP を持ちます。
  • 多くの場合、ISP は DHCP を使用して顧客に IP アドレスを割り当てます。可能性は低いですが、理論的には、DHCP リース時間が期限切れ/更新された場合、セッションの途中でユーザーの IP アドレスが変更される可能性があります。

セッションを使用すると、状況をより適切に処理できる可能性があります。IP アドレスを使用するのではなく、最初に表示されたときにユーザーにセッション トークンを割り当て、後続の要求で (Cookie または HTTP 要求の一部を介して) トークンが渡されるようにします。トークンを取得すると、それが同じユーザーであることをかなり確信で​​きます (スニッフィング攻撃にもかかわらず)。

追加のボーナスとして、IP トラッキングとセッションを組み合わせて、必要に応じて物事をより堅牢にすることができます. たとえば、多くのアプリケーションは、多くの場合、ユーザーの IP が変更されたかどうかを把握しようとし、結果としてセッションを無効にします。

于 2013-01-10T01:01:22.590 に答える
0

REMOTE_ADDRそれ自体が最善の策です。HTTPプレフィックスが付いた$ SERVER変数はクライアントによって変更される可能性があるため、実際には信頼しないでください。HTTP_X_FORWARDED_FORただし、一部のプロキシは、ヘッダーでユーザーの実際のIPを転送します。

于 2013-01-10T00:17:40.713 に答える
0

個人的に私は使用するだけです:

 $_SERVER['REMOTE_ADDR'].

として

$_SERVER['HTTP_X_FORWARDED_FOR'];

偽造がはるかに簡単です。

IPだけで人を特定するのは最善の方法ではありません。それらは一般に、必要がある/したい人がいる誰かによって偽造/回避するのが簡単です。

于 2013-01-10T00:19:39.823 に答える
0

あなたの組み合わせはかなり標準的です (IP ベースの電子サブスクリプション チェックに使用します) が、他の人が指摘しているように、完全ではありません。

HTTP_X_FORWARDED_FOR には複数の転送 IP を指定できることに注意してください。詳細については、 http://en.wikipedia.org/wiki/X-Forwarded-For#Formatを参照してください。

于 2013-01-10T00:21:10.403 に答える