1

私は自分のサイト用の anto-fload スクリプトを作成しています。fail2ban などのようにそれを処理するサービスを使用することはできません。$_SERVER['REMOTE_ADDR'] 値に関する私の質問。この関数が偽の IP を返す方法はありますか? これが可能であるとどこかで聞いたので、それがどのように起こっているのか、それを防ぐために何ができるのか知りたいですか? それは私のスクリプトです:

        $ip = $_SERVER['REMOTE_ADDR'];
    $query = "SELECT * from `banned_users` WHERE `ip`='".$ip."'";
    if(mysql_num_rows(mysql_query($query))!=0)die("you have been banned from the site!");

    if(isset($_SESSION['views']) && isset($_SESSION['time']) && $_SESSION['time']>=time()-2)$_SESSION['views']++;
    else {
        $_SESSION['views']=1;
        $_SESSION['time'] = time();
    }   
    if($_SESSION['views']>=15){
        $query = "INSERT into `banned_users` values ('',".time().",'".$ip."') ";
        mysql_query($query);
        die();
    }

ご覧のとおり、ユーザーが 2 秒間に 15 回以上更新すると、そのユーザーはサイトから追放されます。私が持っている別の質問は、15 の操作に関するものです。それは良い値ですか? 下げるべきですか?私が持っているホスティングには帯域幅の制限があるためです。

ありがとう。

4

4 に答える 4

3

REMOTE_ADDRWeb サーバーによって PHP に提供されます。着信 IP 要求のアドレスから取得します。

一般的にはかなり正確ですが、次のとおりです。

  • 誰かが自分のしていることを知っていて、本当に追跡されたくない場合、なりすましになる可能性があります。

  • また、ユーザーがプロキシ経由でサイトにアクセスしている場合、誤解を招く値になる可能性があります。取得するアドレスは、ユーザーの最終アドレスではなく、プロキシのアドレスになります。($_SERVERプロキシの設定によっては、プロキシ転送アドレスの他のフィールドを取得する場合と取得しない場合があります。また、それが正確であることに依存することはできません)

  • ユーザーが自分のネットワーク内にいる場合、NAT、ファイアウォール、プロキシ、およびその他のネットワーク システムにより、IP アドレスがサイトによって受信されるアドレスとは異なる可能性があるため、ユーザーが考えるアドレスになる場合があります。そのネットワーク内のすべてのユーザーに対して、単一の IP アドレスまたは狭い範囲のアドレスしか表示されない場合があります。これには、多くの (ほとんどの) ビジネス (つまり、オフィスからあなたを訪問する人々) が含まれ、一部の ISP も含まれる場合があります。つまり、その ISP のすべての顧客が同じ IP アドレスに見え、いずれかをブロックする可能性があります。それらはすべてブロックされる可能性があります。

[それは]数字とドットの奇妙な組み合わせ、またはNULL、または必ずしもIPではない何かを取得できますか?

IPv6アドレスが含まれている可能性があると思います。あなたのコードが IPv4 アドレスしか認識しないことを期待している場合、それは問題になります。ただし、一般的には、常に有効な IP アドレスになります (なりすましであっても、サーバーが接続を受け入れるには有効である必要があります)。

于 2013-07-31T10:50:44.820 に答える
1

この関数が数字とドットの奇妙な組み合わせ、または NULL など、必ずしも IP ではないものを返す方法はありますか?

いいえ。

于 2013-07-31T10:49:58.407 に答える
1

RFC 3875 - The common gateway interfaceによると、 REMOTE_ADDR MUSTの値が設定され、IPv4 または IPv6 アドレスである必要があります。

4.1.8. REMOTE_ADDR

   The REMOTE_ADDR variable MUST be set to the network address of the
   client sending the request to the server.

   ...

   The format of an IPv6 address is described in RFC 3513 [15].

apache SAPI と cgi SAPI は、この RFC に準拠することを目指しています。したがって、それらを使用している場合、値は適切な値に設定する必要があり、これ以外の動作はバグになります。

于 2013-07-31T11:13:49.707 に答える