14 votes

Comment pourrais-je protéger une API contre les abus?

Salut tout le monde, je gère un site web d'hébergement d'images et je suis en train de concevoir une API pour celui-ci. Mon souci est que je ne veux pas que quelqu'un puisse faire quelque chose comme :

while(true) { 
    Upload();
}

et spammer/faire du DoS sur le site.

Ma solution actuelle consiste à limiter toutes les adresses IP à un certain nombre d'uploads par jour/heure. Je pense que cela fonctionnera bien pour les applications de bureau qui utiliseront l'API, mais pour les sites web qui souhaitent l'utiliser, tous les utilisateurs auront la même IP (celle du serveur).

Je suppose que la meilleure solution serait d'avoir des comptes utilisateurs qui s'authentifient avec l'API, puis de bannir chaque compte s'ils en abusent. Le problème, c'est que mon site n'a aucun compte utilisateur du tout, c'est entièrement anonyme.

Que puis-je faire d'autre ? Je voudrais garder les choses aussi ouvertes que possible, tout en ayant la possibilité de bannir les utilisateurs/IPs qui abusent clairement du service.

11voto

E Barrett Points 271

Si vous ne voulez pas mettre en place des comptes utilisateurs, que diriez-vous de demander à ceux qui souhaitent utiliser l'API de s'inscrire pour obtenir une clé/secrete API, que vous pouvez utiliser pour limiter le taux d'utilisation.

5voto

Noon Silk Points 30396

Découvrez OAuth.

3voto

Tim Cloonan Points 31

Découvrez un outil de gestion d'API open source tel que apiGrove ; apiGrove.net ou sur GitHub à apigrove.github.com/apigrove. apiGrove prend en charge une variété d'approches pour la protection des API, y compris la liste blanche IP et l'autorisation par clé.

2voto

JasonTrue Points 13615

Dans une entreprise pour laquelle j'ai travaillé, nous avons mis en place un système de régulation pour tous les clients non payants, avec une limite de demande journalière configurable théoriquement pour chaque point d'API. Vous deviez fournir un identifiant unique en tant que clé d'application dans chaque demande, dans la QueryString pour les API légères ou dans le XML de la demande POST pour les API plus complexes. Pour les utilisateurs finaux n'utilisant pas une API publique, vous pouviez passer un jeton d'authentification à la place.

Si vous fournissez une API publique sans exiger un type d'authentification ou d'autorisation, vous devrez recourir à une régulation basée sur l'adresse IP. Mais il n'est pas difficile de créer une page web de provisionnement légère permettant aux gens de s'inscrire pour un accès à l'API.

Votre logique d'application peut réguler en fonction du nombre de demandes, comme nous l'avons fait, ou de la bande passante journalière, comme le fait Flickr.

0voto

Mark Brackett Points 46824

Demander un jeton pour télécharger et restreindre le jeton avec un CAPTCHA. Le code consommant ressemblerait à quelque chose comme :

// 1ère requête
var uploadToken = api.RequestToken(sessionIdFromUser);
if (uploadToken.RequireChallenge) {
   // nécessite un défi en raison d'une limitation par IP
   // uploadToken.Captcha pourrait être une URL
   DisplayView(uploadToken.Captcha, uploadToken.SessionId); 
   return;
}
api.Upload(uploadToken, captchaFromUser, byte[]);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X