Derzeit müssen Sie bei Google einen API-Schlüssel erstellen, der für die Domain spezifisch ist, von der aus die Karte bereitgestellt wird. Wie setzt Google dies durch? Ich möchte das Gleiche tun.
Ich stelle eine API für meinen Dienst bereit, möchte aber Clients ermöglichen, Aufrufe der API über Javascript und nicht nur vom Server aus einzubetten. Ich könnte es mit nur einem zufälligen Token sichern, aber dies könnte natürlich leicht von jedem gefälscht werden, der sich den Code auf dem Client-Computer ansieht.
Ich habe immer verstanden, dass dieses Konzept nicht möglich ist, aber irgendwie leistet Google gute Arbeit bei der Durchsetzung.
Bearbeiten - Es hört sich so an, als hätte Google doch nichts Erstaunliches getan. Ihre API dient höchstwahrscheinlich nur zur Nachverfolgung und nicht wirklich als Garantie dafür, dass ihre API von der Person mit dem Schlüssel verwendet wird.
quelle
Antworten:
Ich bin mir ziemlich sicher, dass sie die REFERER-URL verwenden, um festzustellen, woher der Anruf kommt. Wenn die Domain nicht mit dem übereinstimmt, was dem Schlüssel zugewiesen ist, handelt es sich um eine ungültige Anforderung.
Als praktisches Beispiel können Sie mit PHP die Domain
$_SERVER['HTTP_REFERER']
überprüfen, um den Referer zu überprüfen. Wenn die Domain übereinstimmt, geben Sie eine gültige Antwort zurück. Wenn dies nicht der Fall ist, können Sie eine 401 Unauthorized oder eine andere Antwort zurückgeben.quelle
Der API-Schlüssel selbst ist höchstwahrscheinlich ein Einweg-Hash der Domäne, der der Schlüssel zugeordnet ist, und ein Geheimnis, das nur der Google API-Server kennt. Es kann einige andere bekannte (für Google natürlich) Informationen enthalten. Wenn Sie eine Anfrage von dieser Domäne stellen, nimmt der API-Server die Domäne, von der die Anfrage stammt, und führt dieselbe Einweg-Hash-Berechnung durch und vergleicht die beiden Werte.
Bei Ajax-Aufrufen verwenden sie höchstwahrscheinlich den Referrer, um die Domäne des Dokumenthosts abzurufen. Während der Referrer gefälscht werden kann, müssen Sie letztendlich Google Javascript für die Ausführung im Dokument verwenden, um die API verwenden zu können. Zu diesem Zeitpunkt kann dieses Javascript überprüfen, ob das Dokument, das den Ajax-API-Aufruf aufgerufen hat, tatsächlich vom Zielserver stammt. Dies ist natürlich auch fälschbar, vorausgesetzt, Sie haben eine eigene DOM-Implementierung oder eine sofortige Änderung des Skripts. Dieses Spoofing muss jedoch auf der Client-Seite erfolgen, und die Chancen, dass die Website, die die Google-API verwenden möchte, die Client-Software fälschen kann, sind recht gering.
Da die API im Wesentlichen kostenlos ist, hätten sie auch anonymen Zugriff auf ihre API anbieten können. Anscheinend beabsichtigt Google nicht, den unbefugten Zugriff darauf zu schützen, sondern sicherzustellen, dass sie so viele Daten wie möglich über diese Datennutzung sammeln und diese Nutzung mit anderen Daten verknüpfen können, die sie über die Zieldomäne gesammelt haben. Daher würde ich nicht erwarten, dass die Überprüfung des API-Schlüssels viel komplexer ist als oben beschrieben - der ROI für einen fortgeschritteneren Ansatz ist zu niedrig.
Und natürlich gibt es auch Bedenken hinsichtlich möglicher XSS-Angriffe über ihre API. Aber ich glaube nicht, dass ihr API-Schlüssel zu sehr in einen Anti-XSS-Code eingebunden ist.
quelle
Wie mein Kommentar sagt:
Ich vermute, dass Google wahrscheinlich die IP-Adresse des Anrufers zusammen mit einer DNS-Suche verwendet. DNS ist nicht wirklich fälschbar, da Ihre DNS-Einträge korrekt sein müssen, damit die Website überhaupt zu Ihnen gelangt.
Aber auch das hat seine Probleme, denn wenn ein Server ein Round-Robin-IP-Adress-DNS-Setup verwendet, wird Google bei einer DNS-Suche an eine andere IP-Adresse umgeleitet.
Aus den FAQ
Ich vermute, dass möglicherweise der
Host
Header verwendet wird, der beim Anfordern der Seite gesendet wird. Dies funktioniert wie gewohnt. Google fordert Sie auf, das API-Skript direkt in die Seite aufzunehmen. Dann hat dieses Skript Zugriff auf die Header für die aktuelle Seite und kann dies zur Überprüfung verwenden.Meine Vermutung wird durch die Tatsache gestützt, dass es für IP-Adressen oder Aliase nicht funktioniert, was bedeutet, dass es keine DNS-Prüfung durchführt.
Diese Methode kann nicht gefälscht werden, da sie der richtige Header sein muss, um auf die Seite zuzugreifen. Dies bedeutet jedoch, dass Aliase für die Domäne nicht funktionieren.
Dies bedeutet jedoch auch, dass Sie eine Javascript-Bibliothek bereitstellen MÜSSEN, um auf den Code zugreifen zu können, da Sie diese Serverseite meines Erachtens nicht überprüfen können.
quelle
Ich stimme allen Punkten zu , die Franci Penov aufgelistet hat. Ich möchte etwas näher auf die Verwendung des API-Schlüssels eines anderen eingehen. Nehmen wir an, Sie registrieren sich
key1
beiexample.com
.Erster Versuch - Wenn
anothersite.com
hat<script src="http://www.google.com/jsapi?key=key1">
, Google könnte seine Referrer überprüfen (Hash - Schema genannt) , und in diesem Fall gibt es eine Diskrepanz. Wie überwindet ein böser Angreifer dies, da viele Leute erwähnt haben, dass Überweiser gefälscht werden können? Dies gilt hier nicht wirklich. Sicher, Sie könnten beliebige Header senden, wenn Sie die Anfrage stellen, aber wie fälscht der böse Hacker den Referrer für Benutzeranothersite.com
? Das ist im Allgemeinen nicht einfach. Es gab alte Versionen von Flash in IE 6, die es Angreifern ermöglichten, beim Erstellen domänenübergreifender Anforderungen beliebige Header festzulegen. Im Allgemeinen funktioniert dies jedoch nicht für Skriptesrc
. Ich bin nicht sicher, ob das enthaltene Javascript eine Validierung durchführtdocument.location
, um dies zu verhindern (wahrscheinlich nicht).Zweiter Versuch - Ein böser Angreifer kopiert Google Javascript für den API-Schlüssel aus
mysite.com
der Seitenquelle und bettet dann modifiziertes Javascript einanothersite.com
. Jetzt kann Google nichts mehr überprüfen (die Remote-IP ist der Computer des Nutzers, und Sie oder Google können nicht viel tun).Wenn Sie also aus irgendeinem Grund Ihren API-Schlüssel geheim halten möchten (ein Grund, warum böswillige Personen Ihren Schlüssel auf die schwarze Liste setzen / blockieren können), binden Sie den Schlüssel nicht über Ihren Server in Client- und Proxy-Anfragen ein (Ihr Anwendungscode hat jetzt den Schlüssel).
quelle
Der Grund dafür ist, dass Sie mit Javascript keine API-Aufrufe durchführen können. Die Browsersicherheit verhindert, dass Javascript irgendwo Anfragen stellt, außer an die Domäne, aus der das Javascript stammt. Aus diesem Grund müssen alle API-Aufrufe von Javascript über Ihren Server weitergeleitet werden, auf dem der API-Schlüssel gespeichert ist (der API-Schlüssel wird von Javascript nie gesehen).
quelle