0

5分間の間隔内に5つの不正があった場合、IPによって、たとえば10分間、すべてのリクエストをブロックしたいと思います。そして、パフォーマンスを損なう可能性が最も少ない方法でこのデータを保存する方法を考えています。

特に、DB テーブルの設計方法とデータの格納方法について。

たとえば mysql を使用して、IP の固定テーブルをプライマリとして作成すると、次のようになります。

ip int(10) unsigned, primary key (ip)
attempts int(5),
lastaccess timestamp default current_timestamp

そうすると、試行の蓄積が不十分になります...

一方、タイムスタンプを使用してすべての不正な試行をログに記録すると、次のようになります。

ip int(10) unsigned,
lastaccess timestamp default current_timestamp,
primary key (ip,lastaccess)

そして、5 分間隔内で時間をさかのぼると、このすべてのデータでテーブルが非常に大きくなり、システムの速度が低下する可能性があります...メンテナンスも必要になります。

それで、私にとってもっと便利なことをアドバイスしていただけませんか?...

4

2 に答える 2

3

最後の x 回の試行の IP アドレスとタイムスタンプを保存します。予想されるトラフィック量に応じて、データベース、memcached タイプのストア、または複数のフラット ファイルのいずれかになります。

データベースの場合、次のようなクエリを簡単に実行できCOUNT(timestamps) GROUP BY ip WHERE timestamp [within last 5 minutes]、単純なDELETE WHERE timestamp [over 5 minutes ago]. クリーニングは、cron ジョブまたはガベージ コレクションの種類のシステムで x リクエストごとに発生する可能性があります。

memcached やフラット ファイルなどの場合は、タイムスタンプを FIFO 配列に格納しarray(123456..., 123456..., ...)ます。

于 2012-07-25T07:48:20.020 に答える
1

試してみてください。redisどうしても気になる方にはお勧めですthe table could potentially grow very huge with all this data

ユーザーごとに一意の ID を生成します [おそらく IP ですが、同じネットワークのユーザーを考慮してください。例: 組織のユーザーは、別のマシンからでもすべての発信要求に関連付けられた同じ IP を持ちます] と、キーを一意の ID として、値をカウンターとして [試行回数を保存する] でSTRINGデータ型を使用します。

Stringfrom DOCのユースケースの 1 つ

INCR ファミリのコマンド (INCR、DECR、INCRBY) を使用して、アトミック カウンターとして文字列を使用します。

また、文字列データ型は有効期限をサポートしています。したがって、生成したすべてのキーの有効期限は 5 分間で、制限時間に達すると自己破壊します。カウンター値を読み取るだけで、ユーザーをブロックするかどうかを判断できます。これで、日が進むにつれてレコードの数を気にする必要がなくなりました

Redis はすべてのデータをメモリに保持します。パフォーマンスの向上も得られると思います

于 2012-07-25T08:00:26.477 に答える