3

レート制限がどのように行われるかを見ていましたが、多くの API (StackOverflow v1 API を含む) が IP によってレート制限したり、特定のドメインでの使用に API キーを制限したりしているようです。これはどのように確実に行われますか?

XHR によって生成された API へのリクエストを見ると、リファラー (通常) とリモート アドレスが含まれています。リモートアドレスが有望だと思いましたが、それはリクエストを行っているサイトではなく、ウェブサイトを使用しているユーザーのアドレスのようです。リファラーは常に送信されているわけではないようですが、そこにある場合は、サーバーに対応するIPを検索できると思います。

私の言いたいことは、それは可能でなければならないということです。どうやってやっているの?

4

2 に答える 2

3

不正の分野では、これらは速度制御と呼ばれ、交通管理では「交通シェーピング」に似ています。基本的に、期間ごとに制限された使用を許可しているため、たとえば、10リクエスト/分/IPアドレスのみを許可する場合があります。

'request'ごとに、リモートアドレスを決定します(Cではgetpeername())。この関数は常にリモートユーザーのIPアドレスになります。次に、期間ごとにリクエストがどのように処理されるかを数え、制限を超えた場合は何でもします。擬似コードで

Get block for remote ip
If time-now is new window, then reset usage to zero
Add one to usage count
If usage > allowance then .....
Else if usage > allowance*0.75 then slow-down 
Else ok

単一の期間を示しましたが、ほとんどの実装は通常、1時間ごとに毎分など、複数の期間にわたって平均化されます。バーストを許可し、持続的な負荷のみを制限する傾向がありますが、これは許可するプロファイルによって異なります。

これがAPIの場合、ハードエラーを提供するのではなく、単にリクエストの速度を落とすのが普通です。もう一方の端のクライアントがエラーを処理するという保証はありません。ユーザー画面の場合は、超過した制限を表示できます。

もちろん、IPアドレス、参照、ブラウザタイプ、pageurl、cookieなど、任意のサイズで制限できます。getpeernameを使用している場合、複数の同時ユーザーが共通のプライベートルーターの背後にいると、すべて同じリモートIPアドレスを持つ可能性があることに注意してください。

于 2013-03-18T03:41:10.067 に答える