13

大家好,我运行一个图像托管网站,我正在为它设计一个 API。我担心的是我不希望任何人能够做类似的事情:

while(true) { 
    Upload();
}

和垃圾邮件/DoS 网站。

我目前的解决方案是将所有 IP 地址限制为每天/小时的一定数量的上传。我相信这对于将使用 API 的桌面应用程序来说会很好,但对于希望使用它的网站,所有用户都将拥有相同的 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 支持多种 API 保护方法,包括 IP 白名单和密钥授权。

于 2012-10-24T07:08:21.937 回答
2

在我工作的一家公司,我们为所有非付费客户实施了限制,每天限制一定数量的请求,理论上每个 API 端点都可以配置。如果您必须在每个请求中提供唯一 ID 作为应用程序密钥,则在轻量级 API 的 QueryString 或更复杂 API 的 POST 请求 XML 中。对于不使用公共 API 的最终用户,您可以改为传递身份验证令牌。

如果您提供公共 API 而不需要某种身份验证或授权,您将不得不求助于基于 IP 地址的限制。但是创建一个允许人们注册 API 访问的轻量级供应网页并不难。

您的应用程序逻辑可以像我们所做的那样根据请求数量或像 Flickr 所做的那样根据每日带宽进行节流。

于 2009-09-10T01:46:56.893 回答
0

正如其他人在此线程中提到的那样,API 密钥通常是在这种情况下要走的路。您的站点没有用户帐户这一事实并不重要:API 密钥标识应用程序,而不是用户。(事实上​​,如果您的网站确实有用户,那么您需要单独的机制来在 API 调用中识别应用程序和用户 - 这是 OAuth 非常有用的地方)。

如果您不想创建自己的开发者注册流程、API 密钥发布流程、限制代码等,我建议您看看我的公司 WebServius (www.webservius.com),它提供了托管 API您提供的 API 之上的管理层。

于 2009-09-30T23:27:37.303 回答
0

需要令牌才能上传,并使用验证码限制令牌。使用代码将类似于:

// 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 回答
0

对于在 .NET 中开发的 API,您可以使用API Protector .NET

看到这个答案:https ://stackoverflow.com/a/56075128/1679165

于 2019-05-15T01:37:07.700 回答