Wie vermeide ich die unbefugte Verwendung einer API?

10

Ich muss ein "Widget" entwerfen, ein Skript, das Partner in ihre Websites einbetten, um eine Benutzeroberfläche anzuzeigen und unsere API aufzurufen.

Grundsätzlich werden unsere Daten auf diesen Websites basierend auf einigen IDs angezeigt, die sie in unseren API-Aufrufen bereitstellen. Was wir vermeiden möchten, ist, dass jemand die API missbraucht und sie verwendet, um den gesamten Katalog zu kratzen.

Jeder Partner, der unser Skript einbettet, erhält einen öffentlichen Schlüssel, der beim Aufrufen der API angegeben werden muss. Eine Idee wäre, sie zu bitten, diesen Schlüssel beim Laden des Skripts anzuhängen, z.

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

Auf diese Weise kann die Anforderung für das Skript verwendet werden, um das Schlüssel / Quell-IP-Paar zu registrieren und nachfolgende API-Aufrufe nur zu beantworten, wenn das Schlüssel / IP-Paar mit einem registrierten übereinstimmt (mit einer begrenzten Lebensdauer und einer Begrenzung der Anforderungen pro Tag).

Ich bin mir nicht sicher, ob es eine gute Idee ist, da es offensichtlich Sicherheit durch Verschleierung ist (jemand, der das Skript neu lädt, wird es vollständig umgehen); Ich sehe jedoch keine andere Möglichkeit, den Zugriff einzuschränken. Ich kann nicht jedem Benutzer einen eindeutigen Schlüssel zur Verfügung stellen, nur Partnern. Ich kann kein Private-Key-System verwenden, da der gesamte Code für jedermann verfügbar ist. Grundsätzlich wird der Zugriff auf eine öffentliche API eingeschränkt, was in ihrer Definition widersprüchlich ist.

Was halten Sie von dieser Lösung und was würden Sie mit diesen Einschränkungen tun?

Antoine
quelle
Können Sie den Schlüssel dynamisieren? MD5-Hash der Partnerkennung plus der auf die nächsten 10 Minuten gerundeten UTC-Zeit?
Dan Pichelman
2
Ich kann, aber das wird im Skript berechnet und ist als solches für jedermann frei verfügbar, um es zu reproduzieren. Ich sehe nicht, wie das die Sicherheit verbessert.
Antoine
Ich dachte daran, dass der Partner es serverseitig berechnet. Wenn dies keine Option ist, besteht Ihre einzige wirkliche Wahl vermutlich darin, die von Ihnen erwähnte Drosselung vorzunehmen (begrenzte Lebensdauer, Begrenzung der Anforderungen / Tag). Vergessen Sie nicht, dass die angezeigte IP nicht unbedingt einem einzelnen Computer zugeordnet ist.
Dan Pichelman
Ich muss mich beim Unternehmen erkundigen, ob eine serverseitige Berechnung möglich ist. Ansonsten habe ich befürchtet, dass nur die Lösung gedrosselt wird.
Antoine

Antworten:

12

Sie benötigen verschiedene Arten von Schutz.

Zunächst müssen Sie verhindern, dass der Schlüssel von Site A auf Site B verwendet wird.

Wenn der Schlüssel an eine Domäne gebunden ist, können Sie sich theoretisch nicht auf den refererHeader verlassen. Da Ihr Client jedoch ein Skript direkt einbettet, können Sie sich vernünftigerweise document.locationauf den Client verlassen. Das direkte Senden dieses Standorts (oder von Teilen davon) an den Server ist unzuverlässig. Sie können damit jedoch einen Sitzungsschlüssel generieren:

  1. Client wird client_keyin Anforderung für API-Bibliothek eingebettet.
  2. Der Server bestimmt den Host, der Zugriff auf die API hat, falls vorhanden.
  3. Der Server wählt "salt" für einen Sitzungsschlüssel aus und sendet ihn mit der Bibliothek an den Client [oder als Teil eines anderen Vorauthentifizierungsaustauschs].
  4. Client berechnet eine session_keyVerwendung hash(document.location.host + session_salt).
  5. Der Client verwendet session_key+ client_keyfür einen API-Aufruf.
  6. Der Server überprüft den Anruf, indem er den client_keyHost und "Salt" des Sitzes in der Sitzung nachschlägt, den Hash berechnet und mit dem bereitgestellten vergleicht client_key.

Zweitens müssen Sie Hacker Hank daran hindern, die Debug-Konsole zu öffnen oder einen geänderten Client auf Site A zu verwenden, um mit Ihrer API zu tun, was er will.

Beachten Sie jedoch, dass es sehr schwierig, wenn nicht unmöglich ist, Hacker Hank vollständig daran zu hindern, die API zu missbrauchen. Aber Sie können es schwieriger machen. Und der vernünftigste Weg, Hank zu behindern, den ich kenne, ist die Ratenbegrenzung.

  • Begrenzen Sie die Anzahl der Anforderungen / Sekunde / Sitzung und Anforderungen / Stunde / Sitzung. (Aktivitätsspitzen sind wahrscheinlich angemessen, halten aber keinen überdurchschnittlichen Datenverkehr von einem einzelnen Client aufrecht .)
  • Begrenzen Sie die Anzahl der Sitzungen / IP / Stunde.
  • Begrenzen Sie die Anzahl der Anfragen / IP / Stunde. Erlaube Spitzen, aber keinen anhaltenden starken Verkehr von einer einzelnen IP.

Drittens , wie Sie es wahrscheinlich bereits tun: Verschlüsseln Sie den Datenverkehr. Sicher, die NSA wird es sehen; aber Hacker Hank ist weniger wahrscheinlich.

svidgen
quelle
0

Klingt so, als würden Sie hier Ihre Javascript-Dateien in geschützte Ressourcen verwandeln. Und es gleichzeitig mit einer Art Token-Generierung zu bündeln. Das ist interessant.

Die Sicherheitsleute, mit denen ich zusammenarbeite, entlassen die IP-Adresse normalerweise sofort, weil IP fälschbar ist. Wenn Sie jedoch eine IP-Einschränkung in Kombination mit SSL verwenden, reicht dies normalerweise aus.

Aber Sie müssen die IP-Adressen "auf die Whitelist" setzen, sonst kann jeder Hacker einfach in die Haustür kommen.

Ich war skeptisch, aber ich denke tatsächlich, dass Ihr Schema ziemlich gut funktioniert. Wenn 1) die .js-Datei und nachfolgende API-Aufrufe mit TLS (dh SSL oder https) ausgeführt werden und 2) die IPs auf die Whitelist gesetzt werden. Dann werde ich eine kühne Erklärung abgeben und sagen, dass Sie eine Sicherheitsüberprüfung bestehen würden, selbst für PCI-Interaktionen (Kreditkarteninteraktionen).

IMHO ... Aber wenn Sie nur versuchen, firmeneigene Informationen anstelle von Kreditkarten (PCI) oder persönlichen / privaten Informationen (PII) zu schützen, ist dies wahrscheinlich auch ohne SSL gut, je nachdem, wie viel Sie sind bereit zu riskieren, Ihren Katalog freizulegen.

Oder sagen Sie es so: Mit SSL konnte ein dedizierter Hacker Ihren Katalog nicht erhalten. (Es sei denn, sie brechen SSL, aber dann könnten sie auch Amazon brechen). Ohne SSL könnte ein dedizierter Hacker Ihre Anrufe abhören, IP fälschen und Ihren Katalog abrufen. Es ist also eine Art Urteil über das Risiko.

Ich versuche mir einen Weg zu überlegen, wie ich auf die IP-Whitelist verzichten kann, da dies normalerweise schwierig zu handhaben ist;) ohne zu OAuth zu gehen. Ich werde darauf nudeln.

rauben
quelle