Comment éviter l'utilisation non autorisée d'une API?


10

Je dois concevoir un "widget", un script que les partenaires intégreront dans leurs sites Web pour afficher une interface utilisateur et passer des appels à notre API.

Fondamentalement, il affichera nos données sur ces sites en fonction de certains identifiants qu'ils fournissent dans nos appels API. Ce que nous aimerions éviter, c'est que quelqu'un abuse de l'API et l'utilise pour gratter l'intégralité de notre catalogue.

Chaque partenaire qui intègre notre script recevra une clé publique qui doit être fournie lors de l'appel de l'API. Une idée serait de leur demander d'ajouter cette clé lors du chargement du script, par exemple:

<script src="//initrode.com/widget/loader.js?key=xxxx"></script>

De cette façon, la demande de script peut être utilisée pour enregistrer la paire IP clé / source et répondre aux appels d'API suivants uniquement si la paire clé / IP correspond à une paire enregistrée (avec une durée de vie limitée et une limite de demandes par jour).

Je ne suis pas sûr que ce soit une bonne idée, car il s'agit évidemment de sécurité grâce à l'obscurcissement (quelqu'un rechargeant le script le contournera complètement); mais je ne vois pas d'autre moyen de restreindre l'accès. Je ne peux pas fournir une clé unique à chaque utilisateur, uniquement aux partenaires. Je ne peux pas utiliser de système à clé privée car tout le code sera accessible à tous. Il s'agit essentiellement de restreindre l'accès à une API publique, c'est-à-dire contradictoire dans sa définition.

Que pensez-vous de cette solution et que feriez-vous de ces contraintes?


Pouvez-vous rendre la clé dynamique? Hachage MD5 de l'identifiant du partenaire plus le temps UTC arrondi aux 10 minutes les plus proches?
Dan Pichelman

2
Je peux, mais cela sera calculé dans le script, et en tant que tel disponible gratuitement pour quiconque de le reproduire. Je ne vois pas comment cela améliore la sécurité.
Antoine

Je pensais que le partenaire le calculerait côté serveur. Si ce n'est pas une option, je soupçonne que votre seul vrai choix est de faire la limitation que vous mentionnez (durée de vie limitée, limite de demandes / jour). N'oubliez pas que l'IP que vous voyez ne correspond pas nécessairement à un seul ordinateur.
Dan Pichelman

Je dois vérifier auprès de l'entreprise si le calcul côté serveur est possible. Sinon, c'est ce que je craignais, la seule solution est la limitation.
Antoine

Réponses:


12

Vous avez besoin de plusieurs types de protection.

Tout d'abord , vous devez empêcher l'utilisation de la clé du site A sur le site B.

En théorie, si la clé est liée à un domaine, vous ne pouvez pas dépendre de l'en- referertête, mais comme vous êtes client incorpore directement un script, vous pouvez raisonnablement compter sur le document.locationcôté client. L'envoi de cet emplacement (ou de portions de celui-ci) directement au serveur n'est pas fiable; mais vous pouvez l'utiliser pour générer une clé de session:

  1. Le client intègre la client_keydemande de bibliothèque d'API.
  2. Le serveur détermine l'hôte qui a accès à l'API, le cas échéant.
  3. Le serveur choisit «sel» pour une clé de session et l'envoie au client avec la bibliothèque [ou dans le cadre d'un autre échange de préautorisation].
  4. Le client calcule une session_keyutilisation hash(document.location.host + session_salt).
  5. Le client utilise session_key+ client_keypour un appel API.
  6. Le serveur valide l'appel en recherchant l' client_keyhôte et le «sel» de la session, en calculant le hachage et en le comparant à celui fourni client_key.

Deuxièmement , vous devez empêcher Hacker Hank d'ouvrir la console de débogage ou d'utiliser un client modifié sur le site A pour faire ce qu'il veut avec votre API.

Notez cependant qu'il est très difficile, voire impossible, d' empêcher complètement Hacker Hank d'abuser de l'API. Mais, vous pouvez rendre cela plus difficile. Et le moyen le plus raisonnable d'entraver Hank, à ma connaissance, est de limiter le taux.

  • Limitez le nombre de requêtes / seconde / session et de requêtes / heure / session. (Les pics d'activité sont probablement raisonnables, mais pas un trafic supérieur à la moyenne provenant d'un seul client.)
  • Limitez le nombre de sessions / IP / heure.
  • Limitez le nombre de requêtes / IP / heure. Autorisez les pics, mais pas le trafic lourd soutenu à partir d'une seule adresse IP.

Troisièmement , comme vous le faites probablement déjà: chiffrez le trafic. Bien sûr, la NSA le verra; mais Hacker Hank est moins susceptible de le faire.


0

On dirait que vous faites ici en transformant vos fichiers javascript en ressources protégées. Et le regrouper avec une sorte de génération de jetons en même temps. C'est intéressant.

Les gars de la sécurité avec lesquels je travaille rejettent généralement l'adresse IP d'emblée parce que l'IP est usurpé. Mais si vous utilisez une restriction IP combinée à SSL, cela fait généralement l'affaire.

Mais vous devez "mettre sur liste blanche" les adresses IP, sinon tout pirate informatique peut simplement entrer par la porte d'entrée.

J'étais sceptique, mais je pense en fait que votre système fonctionne plutôt bien. Si 1) le fichier .js et les appels d'API suivants sont effectués avec TLS (c'est-à-dire SSL ou https), et 2) les adresses IP sont sur liste blanche. Ensuite, je vais faire une déclaration audacieuse et dire que je pense que vous passeriez un examen de sécurité, même pour les interactions PCI (carte de crédit).

À mon humble avis ... Mais si vous essayez simplement de protéger les informations exclusives de l'entreprise au lieu des informations de carte de crédit (PCI) ou personnelles / privées (PII), cela est probablement bon même sans SSL, selon le montant prêt à risquer d'exposer votre catalogue.

Autrement dit: avec SSL, un pirate dédié ne pourrait pas obtenir votre catalogue. (À moins qu'ils ne cassent SSL, mais ils pourraient aussi casser Amazon). Sans SSL, un pirate dédié pourrait flairer vos appels, usurper l'IP et dérouler votre catalogue. C'est donc une sorte de jugement sur le risque.

J'essaie de penser à un moyen de se passer de la liste blanche IP parce que c'est généralement une douleur à gérer;) sans aller à OAuth à part entière. Je vais faire des nouilles là-dessus.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.