2011-06-21 3 views
10

私は悪用を避けるために、Railsアプリケーションのレート制限をREST APIに追加したいと考えています。これについて少し調べてみると、アプリケーション自体でこれをチェックするのではなく、move this responsibility into the web serverがベストプラクティスのように見えます。残念ながら、私がHerokuにアプリケーションをホストしているので、私の場合はこれを行うことができないため、Webサーバーの設定を制御することはできません。HerokuでレートリミットRESTリクエスト

この場合、APIの不正使用を防止するために何を行う必要がありますか?

+1

ええと、レスポンスの大きさに応じて、ソリューションを一緒にハックすることもできます(醜いかもしれませんが)。たとえば、レスポンスが小さい場合(制限するレスポンスが1MB未満の場合)、実行中のアクションに基づいて、特定のセッションからのリピート要求が制限/遅延されるタイマーを設定できます。代わりに、あなたの応答が大きい場合、これは応答の間隔を置くだけです(転送速度を遅くするのではなく)。 – jefflunt

+0

@normalocityうーん、私はこのアイデアが好きです!私は脆弱なコントローラの単純なbefore_filterでは醜いとは思わない。より複雑なルールを追加すると複雑になる可能性があります(ユーザーあたり1分あたり10リクエスト)。 – xoebus

+0

ええ、多分私はそれを答えとして提出するでしょう。 :)最後にリクエストしたときにメモしたユーザーアカウントにフィールドを追加することもできます。難しいことは、Mongrel(または別のシングルスレッドのWebサーバー)を使用している場合は、単にリクエストを遅らせるだけで、他のすべてのユーザーを減速させることになります。私はそれが私が醜いことが意味するものだと思う。別のWebサーバーを使用しているのであれば、このアプローチが有効かもしれません。 – jefflunt

答えて

1

あなたが探しているものはrack-throttleまたはrack-attackの宝石です。どちらもスロットリングが可能で、rack-attackの宝石を使用すると、複数の時間違反者またはリクエスターをブロックしたい他の理由がある場合に、一定期間IPアドレスをブロックすることができます。

0

クッキーをクライアントに置くことをお勧めします。ユーザーアカウントの最後の時間を記録するフィールド(多くの認証プラグインはこれを既に実行しています)を追加することを検討してください。 5秒前(20リクエスト/秒)より最近の

注:単一スレッドのWebサーバー(Mongrelなど)を使用すると、拒否ではなく明示的な遅延を設定すると、そのMongrelに対する他の保留中の要求が遅延することがあります。つまり、他のユーザーに影響を与えることになります。たぶん小さなjavascript/ajaxレスポンスが、レート制限されていることをユーザーに通知することができます(適切な場合)。 StackOverflowがあなたがサイト上であまりにも頻繁に特定のことをすることを妨げる方法を考えてください。

+1

"user"アカウントにフィールドを配置することを終了しました(この場合は直接変換しません)。 (さて、プライバシはこのアプリケーションの関心事なので、私たちはRedisを使ってこの情報を保存し、短期間に[EXPIRE](http://redis.io/commands/expire)キーを押します) – xoebus

+3

この回答危険で間違っています。 「クライアントにクッキーを置く」とは、文字通り攻撃者/悪用者をレート制限するものではありません。ユーザーオブジェクトにタイムスタンプを付けると、a)ユーザーが2つの正当なリクエストを連続して実行するのを防ぎます。(b)APIの最も重要なエンドポイントであるレート制限を行いません。認証されていない要求のレートを制限していない場合は、スクリプトを書くことができる誰でも簡単にユーザーのパスワードをブルートフォースできます。認証エンドポイントの制限を厳しくして、IPアドレスでレートを制限したいとします。 – fletom

+0

@fletom - あなたは正しいです(3年前に戻ってきています)。これははるかに良い解決策です。あなたが答えを書き留めたいのであれば、私は喜んで私のものを削除し、あなたをアップフォートするでしょう。 – jefflunt

関連する問題