0

例を挙げて、私が何をしようとしているのかを説明しましょう。特定の国から来たユーザーに対して、Web サイトのスクリプトの一部をブロック (無効化または非表示) したいとします。ここからその国の IP のリストを取得できます。これにより、aa.bb.cc.0/33 kk.ss.yy.0/24 などの形式で IP 範囲が得られます

ただし、訪問者の IP を PHP のリストと比較する最速の方法を探しています。そのリストをファイルに保存する必要がありますか? または、IPをデータベースに保存する必要がありますか?

.htaccess の deny コマンドを使用すると、ユーザーが当社の Web サイトにアクセスするのを完全にブロックしてしまいます。そのため、より柔軟性のある PHP で行う必要があります。私がしたことは、これらの範囲のIPをファイルに保存し、毎回ユーザーのIPをファイル内のIPと比較することでした。しかし、それはあまり良い考えではないという印象を受けています。最速の方法と方法を教えてください。ありがとう

4

3 に答える 3

1

PHP を使用する必要がある場合は、ブロックされた IP 範囲のリストをデータベースに保存します。これは、テキストファイルを読み取ったり、静的な PHP コードからハッシュマップを生成したりする代わりに、この情報を検索する最速の方法の 1 つになります (更新するのも面倒です)。ルックアップを高速化するには、フィールドで適切にインデックスを使用し、キャッシュを使用します。同じ IP アドレスがサイトの複数のページを参照する可能性が高いためです。

データベース テーブルを生成し、IP のさまざまな部分に 5 つの列を使用します。これは、毎月、またはリストを更新するたびに行う必要があります。これは、選択したスクリプト言語と cron などを使用して実行できます。

blocked_tbl:
classA   classB   classC    min    max
------   -------  ------   ----- ------
214       101       99       1     255
178       22        45       1     255
...       ...       ...     ...    ...

次に、Web サイトの訪問者の IP アドレスをその範囲と比較できます。たとえば、次のようにします (substr メソッドを使用して PHP の IP アドレスを 4 つの部分に分割するか、$ipA、$ipB、$ipC、および $ipD になるように分解します)。

SELECT count(*) FROM blocked_tbl WHERE
blocked_tbl.classA = $ipA AND
blocked_tbl.classB = $ipB AND
blocked_tbl.classC = $ipC AND
(blocked_tbl.min <= $ipD AND blocked_tbl.max >= $ipD)
于 2013-03-04T11:07:37.480 に答える
0

最善の方法は、IPのリストをデータベースに保存し、IP列を主キーとして作成し、テーブルでユーザーIPの発生を確認することです。

別の方法(データベースなし)は、IPのハッシュテーブルを作成し、O(1)でユーザーIPの発生をチェックインすることです。

明らかに、チェックする前にIPをネットワークマスクする必要があります...

于 2013-03-04T11:01:12.073 に答える
0

IP範囲/マスクが指定されたMatch IPv4アドレスですでに回答されているようです?

それらをどのように保管するかについては、そのためだけにデータベースをセットアップするつもりはありません。配列に読み込むフラットなテキスト ファイルでしょうか。すでに DB がある場合は、はい、それを使用してください。

于 2013-03-04T11:03:05.200 に答える