0

私の django プロジェクトには、投稿、コメント、編集など、サイト上で何かを行うための機能を持つユーザー モデルがあります。迷惑メールを防ぐために、1 日あたりのアクション数を制限する方法を考えていました。 datetime 関連のもの このための機能を作成するために、データをキャッシュ (memcached) に保存することにしました。

編集:解決策が見つかりました:

私は古い実装を使用しており、1 日あたりの投稿数をキャッシュし、1 日をタイムアウトとして設定しています。しかし、選択したキャッシュ キーを 1 日 1 回チェックしてワイプするセロリの非同期 cron ジョブもあります。

だから私は以下に持っていた元のコードに加えて、これを使用しています:

from django.core.cache import cache
from lib.cache_keys import daily_count_key
from django.contrib.auth.models import User

@periodic_task(run_every=crontab(hour='*/24')) # AKA run once a day
def wipeDailyLimits():
users = User.objects.all()
for user in users:
    cache.delete(daily_count_key("modelone", user))
    cache.delete(daily_count_key("modeltwo", user))
    cache.delete(daily_count_key("modelthree", user))

例:

def post_entry(request):
   # post the entry
   daily_post_count = cache.get(request.user.id + "entrycount")

   if daily_post_count >= 5:
       return error

   if daily_post_count is None:
       daily_post_count  = 1

   if daily_post_count < 5:  # 5 posts per day
       daily_post_count += 1

   cache.set(request.user.id + "entrycount", daily_post_count , 86400)
                                               # Unix one day time out
   # return regular

これまでのところ、この戦略はうまく機能しているように見えますが、ユーザーがこのシステムを破るために使用できる抜け穴やトリックがあるかどうか知りたいですか? もしそうなら、ほとんどの人はdjangoの制限をどのように処理していますか?

ありがとう

4

3 に答える 3

1

別のアプローチを使用することをお勧めします。あなたの現在のアプローチは、スパムではないにもかかわらず、ユーザーが自分の投稿が伝わったかどうかを認識していないことを意味します。むしろ、制限したい場合は、ページ/サイトをレンダリングする前に、制約したいことを実行するミドルウェアを追加し、その状態にフラグを追加します。そうすれば、適切なフラグベースの警告メッセージを表示し、制限に達した後にユーザーが投稿できないようにすることができます。count()HTTPResponsedaily_limt_exceeeded=True

必要に応じて、サイトのコメントにDjango コメント フレームワークを使用できます。これには、いくつかのスパム保護が付属しています。

コメントフォームの注意事項

コメント システムで使用されるフォームには、知っておくべき重要なスパム対策属性がいくつかあります。これには、タイムスタンプ、コメントを添付する必要があるオブジェクトに関する情報を含む多数の隠しフィールドが含まれています。この情報を検証します。誰かがこのデータを改ざんした場合 (コメント スパマーが試みる何か)、コメントの送信は失敗します。カスタム コメント フォームをレンダリングする場合は、これらの値を変更せずに渡す必要があります。タイムスタンプは、「応答攻撃」が非常に長く続くことがないようにするために使用されます。フォームをリクエストしてからコメントを投稿するまでに時間がかかりすぎるユーザーは、投稿を拒否されます。

コメントフォームには「ハニーポット」フィールドが含まれています。これは罠です。そのフィールドにデータが入力された場合、コメントはスパムと見なされます (スパマーは、有効な投稿をしようとして、すべてのフィールドに自動的に入力することがよくあります)。

デフォルトのフォームは、このフィールドを CSS で非表示にし、さらに警告フィールドでラベル付けします。カスタム テンプレートでコメント フォームを使用する場合は、必ず同じことを行う必要があります。コメント アプリは、Django に付属するより一般的なクロス サイト リクエスト フォージェリ保護にも依存しています。ドキュメントに記載されているように、CsrfViewMiddleware を使用することをお勧めします。ただし、それを使用しない場合は、コメント フォームを含むすべてのビューで csrf_protect デコレータを使用して、それらのビューが CSRF トークンと Cookie を出力できるようにする必要があります。

于 2012-10-06T09:44:23.683 に答える
1

2つのこと。

  • ユーザーが一度に複数の投稿を行う場合、複数のプロセスがカウントを読み取ることができ、両方ともdaily_post_countを増やし、両方とも古い値+ 1を保存できるため、それらを通過する可能性があります(互いに実行した場合、古い値を保存します)最後に + 2) 問題になる可能性はほとんどありません。

  • 投稿を保存するたびにタイムアウトをリセットするため、カウントが思い通りにリセットされません。1回投稿して、23時間後にもう1回、23時間後にもう1回投稿すると、カウントは3になりますが、46時間経過します. カウンターを 0 に設定する唯一の方法は、投稿せずに 24 時間待つことです。できるはずなのに投稿できないと、ユーザーを困らせる可能性が非常に高いです:)

于 2012-10-06T08:57:04.390 に答える
0

両方の利点を持ちながら、より簡単に実装できるソリューションを見つけました。私は古い実装を使用しており、1 日あたりの投稿数をキャッシュし、1 日をタイムアウトとして設定しています。しかし、選択したキャッシュ キーを 1 日 1 回チェックしてワイプするセロリの非同期 cron ジョブもあります。

テンプレートに変数が渡されるだけなので、ユーザーは制限されていることがわかります。

とにかく助けてくれてありがとう!

于 2012-10-07T02:04:29.647 に答える