Comment Google Maps sécurise-t-elle sa clé API? Comment faire quelque chose de similaire?

actuellement, Google vous demande de créer une clé API qui est spécifique au domaine d'où la carte sera servie. Comment est-ce que Google respecter cela? Je veux faire la même chose.

j'expose une API pour mon service mais je veux permettre aux clients d'intégrer des appels à L'API via javascript et pas seulement à partir du serveur. Je pourrais le sécuriser avec juste un jeton aléatoire mais bien sûr cela pourrait être facilement mystifié par quiconque regardant le code sur la machine client.

j'ai toujours compris que ce concept n'était pas possible, mais D'une manière ou d'une autre Google fait du bon travail pour l'appliquer.

Edit-il semble que Google n'a vraiment rien fait d'étonnant après tout. Leur API est probablement juste de suivi et pas vraiment pour garantir que leur API est utilisée par la personne avec la clé.

70
demandé sur hippietrail 2010-02-13 05:54:25

5 réponses

je suis certain qu'ils utilisent L'URL du REFERER pour déterminer d'où vient l'appel. Si le domaine ne correspond pas à ce qui est assigné à la clé, c'est une requête invalide.

pour un exemple pratique, en utilisant PHP vous pouvez vérifier le domaine en utilisant $_SERVER['HTTP_REFERER'] pour vérifier le referer. Si le domaine correspond, retournez une réponse valide. Si ce n'est pas le cas, vous pouvez retourner une réponse 401 non autorisée ou autre.

28
répondu Trevor 2010-02-13 03:07:57

la clé API elle-même est très probablement un hachage à Sens Unique du domaine auquel elle est associée et un secret que seul le serveur API Google connaît. Il peut contenir d'autres éléments de bien-connus (Google, bien sûr). Lorsque vous faites une requête à partir de ce domaine, le serveur API prend le domaine d'où provient la requête et fait le même calcul de hachage et compare les deux valeurs.

pour les appels Ajax, ils utilisent très probablement le referrer pour obtenir le domaine du document hôte. Alors que le referrer peut être mystifié, en fin de compte afin d'utiliser L'API, vous devez obtenir Google javascript à exécuter dans le document. À ce stade, ce javascript peut vérifier que le document qui a invoqué L'appel de L'API Ajax provenait effectivement du serveur cible. Ceci est également spoofable bien sûr, à condition que vous ayez votre propre implémentation DOM ou une modification du script à la volée. Cependant, cette mystification doit se produire du côté du client et les chances que le site web qui veut utiliser L'API Google sera en mesure de spoof le logiciel client sont assez petits.

notez que puisque L'API est essentiellement gratuite, ils auraient pu offrir un accès anonyme à leur API ainsi. Apparemment, L'intention de Google n'est pas de protéger l'accès non autorisé à elle, mais de s'assurer qu'ils peuvent recueillir autant de données que possible sur l'utilisation de données et être en mesure d'associer cet usage avec d'autres données qu'ils ont recueillies sur le domaine cible. En tant que tel, j' Je ne m'attendais pas à ce que la vérification des clés API soit beaucoup plus complexe que ce que j'ai décrit ci - dessus-le retour sur investissement pour une approche plus avancée est trop faible.

et bien sûr, il ya aussi la préoccupation d'éventuelles attaques XSS à travers leur API. Mais je ne crois pas que leur clé API est trop liée à un code anti-XSS qu'ils ont.

63
répondu Franci Penov 2010-02-13 04:34:59

comme dit mon commentaire:

le REFERER est spoofable, il est donc peu probable que Google l'utilise comme un moyen de vérification. Voir cette entrée de wikipedia.

à mon avis, Google utilise probablement l'adresse IP de l'appelant avec une recherche DNS. DNS n'est pas vraiment spoofable, car vos entrées DNS doivent être correctes pour que le site web puisse vous atteindre.

Mais, même cela a ses problèmes, parce que si un serveur utilise une adresse IP Ronde DNS setup, Google sera redirigé vers une adresse IP différente lors d'une recherche DNS.

de la FAQ

notez qu'une clé pour http://www.mygooglemapssite.com / ne sera accepté que lorsque le site est accédé à l'aide de cette adresse. Il ne sera pas accepté si le site est accédé par adresse IP (par ex. http://10.1.2.3 / ) ou par un nom d'hôte www.mygooglemapssite.com utilisation d'un enregistrement CNAME DNS.

à mon avis, il se peut qu'il utilise l'en-tête Host envoyé lors de la demande de la page, qui fonctionnerait comme Google vous demande normalement d'inclure son script API directement dans la page. Alors ce script a accès aux en-têtes de la page courante et peut l'utiliser pour vérifier.

je pense qu'il est soutenu par le fait qu'il ne fonctionne pas pour les adresses IP ou les alias, ce qui signifie qu'il ne fait pas de vérification DNS.

cette méthode ne peut pas être usurpée, car elle doit être l'en-tête correct pour accéder à la page. Cependant, cela signifie que les alias du domaine ne fonctionneront pas.

cependant, cela signifie également que vous devez fournir une bibliothèque Javascript pour accéder au code, car vous ne pouvez pas vérifier ce côté du serveur, je crois.

3
répondu Tyler Carter 2010-02-13 03:23:13

je suis d'accord avec tous les points que Franci Penov a énumérés. j'aimerais développer un peu sur l'utilisation de la clé API de quelqu'un d'autre. Supposons que vous enregistrez key1 avec example.com .

  1. première tentative – si anothersite.com a <script src="http://www.google.com/jsapi?key=key1"> , Google peut vérifier son referrer (hash schéma mentionné) et dans ce cas il ya une inadéquation. Comment l'attaquant diabolique surmonte-t-il cela, puisque beaucoup de gens l'ai mentionné que l'affilié peut être usurpée? Ce n'est pas vraiment s'appliquer ici. Bien sûr, vous pouvez envoyer des en-têtes arbitraires si vous faites la demande, mais comment le pirate maléfique spoof referrer pour les utilisateurs sur anothersite.com ? Ce n'est pas facile. Il y a eu de vieilles versions de flash sur IE 6 qui ont permis à l'attaquant de définir des en-têtes arbitraires lors de la réalisation de requêtes de domaines croisés, mais en général ce n'est pas réalisable pour le script src . Je ne suis pas sûr si le Javascript inclus fait une validation de document.location pour éviter cela (probablement pas).

  2. deuxième tentative – un attaquant malveillant copie Google Javascript pour la clé API à partir de la page source de mysite.com et intègre javascript modifié sur anothersite.com . Maintenant, Google ne peut rien vérifier (L'IP distante sera l'ordinateur de l'utilisateur, et il n'y a pas grand chose que vous ou Google pouvez faire).

donc, si vous voulez pour une raison quelconque garder votre clé API secret (one reason, malicious person can get your key blacklisted/blocked), puis ne pas intégrer la clé dans les requêtes client et proxy via votre serveur (votre code d'application a maintenant la clé).

2
répondu mar 2018-08-16 13:20:10

la raison pour laquelle il fonctionne est que vous ne pouvez pas faire des appels API avec javascript. La sécurité du navigateur empêche javascript de faire des requêtes n'importe où sauf dans le domaine d'où provient javascript. Pour cette raison, tous les appels API à partir de javascript doivent être renvoyés par votre serveur où la clé API est stockée (la clé api n'est jamais vue par javascript).

-6
répondu Jeffrey Aylesworth 2010-02-13 03:01:11