13

みなさん、私は画像ホスティング Web サイトを運営しており、その API を設計しています。私の懸念は、誰にも次のようなことをさせたくないということです:

while(true) { 
    Upload();
}

スパム/DoS サイト。

私の現在の解決策は、すべての IP アドレスを 1 日/1 時間あたりのアップロード数に制限することです。これは、API を使用するデスクトップ アプリケーションでは問題なく機能すると思いますが、それを使用したい Web サイトでは、すべてのユーザーが同じ IP (サーバーの IP) を持つことになります。

最善の解決策は、API で認証するユーザー アカウントを用意し、悪用した場合は各アカウントを禁止することだと思います。これに関する問題は、私のサイトにはユーザー アカウントがまったくなく、すべて完全に匿名であることです。

他に何ができますか?明らかにサービスを悪用しているユーザー/IP を禁止する機能を持ちながら、可能な限りオープンに保ちたいと考えています。

4

7 に答える 7

11

ユーザー アカウントを実装したくない場合は、API を使用したいユーザーに、レート制限に使用できる API キー/シークレットにサインアップしてもらいます。

于 2009-09-10T01:40:33.083 に答える
5

OAuthを確認してください。

于 2009-09-10T01:39:08.320 に答える
3

apiGroveのようなオープンソースのAPI管理ツールをチェックしてください。apiGrove.netまたはGitHubのapigrove.github.com/apigroveにあります。apiGroveは、IPホワイトリストやキーによる承認など、API保護に対するさまざまなアプローチをサポートしています。

于 2012-10-24T07:08:21.937 に答える
2

私が働いていたある会社では、API エンドポイントごとに理論的に構成可能な、1 日あたりの特定の数のリクエストの制限で、すべての無料の顧客に対してスロットリングを実装しました。各リクエスト、軽量 API の場合は QueryString、より複雑な API の場合は POST リクエスト XML で、アプリケーション キーとして一意の ID を指定する必要がある場合。パブリック API を使用していないエンドユーザーには、代わりに認証トークンを渡すことができます。

なんらかの認証や承認を必要としないパブリック API を提供する場合は、IP アドレス ベースのスロットリングに頼る必要があります。しかし、人々が API アクセスにサインアップできる軽量のプロビジョニング Web ページを作成することは難しくありません。

アプリケーション ロジックは、私たちが行ったようにリクエスト数に基づいて調整したり、Flickr のように毎日の帯域幅に基づいて調整したりできます。

于 2009-09-10T01:46:56.893 に答える
0

他の人がこのスレッドで言及しているように、APIキーはそのような状況で行く方法であることがよくあります。サイトにユーザーアカウントがないという事実は重要ではありません。APIキーはユーザーではなくアプリケーションを識別します。(実際、サイトにユーザーがいる場合は、API呼び出しでアプリとユーザーを識別するための個別のメカニズムが必要です。これはOAuthが非常に役立つ場所です)。

独自の開発者登録プロセス、APIキー発行プロセス、スロットリングコードなどを作成したくない場合は、ホストされたAPIを提供する私の会社であるWebServius(www.webservius.com)を確認することをお勧めします。提供するAPIの上にある管理レイヤー。

于 2009-09-30T23:27:37.303 に答える
0

アップロードするトークンを要求し、CAPTCHA でトークンを制限します。コードの消費は次のようになります。

// 1st request
var uploadToken = api.RequestToken(sessionIdFromUser);
if (uploadToken.RequireChallenge) {
   // requires challenge due to per IP limiting
   // uploadToken.Captcha could be a URL
   DisplayView(uploadToken.Captcha, uploadToken.SessionId); 
   return;
}
api.Upload(uploadToken, captchaFromUser, byte[]);
于 2009-09-10T01:48:49.790 に答える