web-dev-qa-db-fra.com

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

Actuellement, Google vous demande de créer une clé API spécifique au domaine d'où la carte sera servie. Comment Google applique-t-il 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 usurpé par quiconque regarde le code sur la machine cliente.

J'ai toujours compris que ce concept n'était pas possible, mais Google fait en quelque sorte un bon travail pour le faire respecter.

Modifier - On dirait que Google n'a vraiment rien fait d'étonnant après tout. Leur API est très probablement juste pour le suivi et pas vraiment pour garantir que leur API est utilisée par la personne avec la clé.

73
Vyrotek

Je suis tout à fait certain qu'ils utilisent l'URL REFERER pour déterminer d'où vient l'appel. Si le domaine ne correspond pas à ce qui est attribué à la clé, il s'agit d'une demande non valide.

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

29
Trevor

Je suis d'accord avec tous les points que Franci Penov a énumérés. Je voudrais développer un peu 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 pourrait vérifier son référent (schéma de hachage mentionné) et dans ce cas il y a un décalage. Comment l'attaquant maléfique surmonte-t-il cela, car beaucoup de gens ont mentionné que le référent peut être usurpé? Cela ne s'applique pas vraiment ici. Bien sûr, vous pouvez envoyer des en-têtes arbitraires si vous en faites la demande, mais comment le pirate malveillant peut-il usurper la référence pour les utilisateurs sur anothersite.com? Ce n'est généralement pas facile. Il y avait d'anciennes versions de flash sur IE 6 qui permettaient à l'attaquant de définir des en-têtes arbitraires lors des requêtes interdomaines, mais en général, cela ne fonctionne pas pour le script src. Je suis Je ne sais pas 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, Puis intègre le javascript modifié sur anothersite.com. Maintenant, Google ne peut plus rien vérifier (l'IP distante sera l'ordinateur de l'utilisateur et il n'y a pas grand-chose que vous ou Google puissiez faire).

Donc, si vous voulez, pour une raison quelconque, garder votre clé API secrète (une raison, une personne malveillante peut obtenir votre clé sur liste noire/bloquée), alors n'intégrez pas la clé dans les demandes client et proxy via votre serveur (votre code d'application a maintenant le clé).

3
mar

Comme mon commentaire le dit:

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

Je suppose que Google utilise probablement l'adresse IP de l'appelant avec une recherche DNS. Le DNS n'est pas vraiment spoofable, car vos entrées DNS doivent être correctes pour que le site Web puisse même vous atteindre.

Mais, même cela a ses problèmes, car si un serveur utilise une configuration DNS d'adresse IP Round-Robin, 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ée que lorsque le site est accessible via cette adresse. Il ne sera pas accepté si le site est accessible par une adresse IP (par exemple http://10.1.2.3/ ) ou par un nom d'hôte qui est alias à www.mygooglemapssite.com en utilisant un enregistrement DNS CNAME .

Je suppose qu'il pourrait utiliser l'en-tête Host qui est envoyé lors de la demande de la page, ce qui fonctionnerait normalement, Google vous demande d'inclure son script API directement dans la page. Ensuite, ce script a accès aux en-têtes de la page en cours et peut l'utiliser pour vérifier.

Je suppose que cela 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 falsifiée, car elle doit être l'en-tête correct pour accéder à la page. Cependant, cela signifie que tous 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é serveur, je crois.

3
Tyler Carter