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?
quelle
Antworten:
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
referer
Header verlassen. Da Ihr Client jedoch ein Skript direkt einbettet, können Sie sich vernünftigerweisedocument.location
auf 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:client_key
in Anforderung für API-Bibliothek eingebettet.session_key
Verwendunghash(document.location.host + session_salt)
.session_key
+client_key
für einen API-Aufruf.client_key
Host und "Salt" des Sitzes in der Sitzung nachschlägt, den Hash berechnet und mit dem bereitgestellten vergleichtclient_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.
Drittens , wie Sie es wahrscheinlich bereits tun: Verschlüsseln Sie den Datenverkehr. Sicher, die NSA wird es sehen; aber Hacker Hank ist weniger wahrscheinlich.
quelle
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.
quelle