Ich entwickle die erholsame Web-App, die beispielsweise ein beliebtes Web-Framework im Backend verwendet (Rails, Sinatra, Flask, Express.js). Idealerweise möchte ich die Client-Seite mit Backbone.js entwickeln. Wie lasse ich nur meine Javascript-Clientseite mit diesen API-Aufrufen interagieren? Ich möchte nicht, dass diese API-Aufrufe öffentlich sind und von curl
oder einfach durch Eingabe des Links im Browser aufgerufen werden .
91
Antworten:
Wenn Ihre API von Ihrem JS-Client verwendet wird, müssen Sie zunächst davon ausgehen, dass sie öffentlich ist: Ein einfacher JS-Debugger versetzt einen Angreifer in die Lage, eine byteweise identische Anforderung von a zu senden Werkzeug seiner Wahl.
Wenn ich Ihre Frage jedoch richtig lese, ist dies nicht das, was Sie vermeiden möchten: Was Sie wirklich nicht wollen, ist, dass Ihre API (regelmäßig) verwendet wird, ohne dass Ihr JS-Client beteiligt ist. Hier sind einige Ideen, wie Sie, wenn Sie dies nicht durchsetzen, zumindest die Verwendung Ihres Kunden fördern können:
Ich bin sicher, Ihre API verfügt über eine Art Authentifizierungsfeld (z. B. auf dem Client berechneter Hash). Wenn nicht, werfen Sie einen Blick auf diese SO-Frage . Stellen Sie sicher, dass Sie einen Salt (oder sogar einen API-Schlüssel) verwenden, der Ihrem JS-Client auf Sitzungsbasis übergeben wird (nicht fest codiert). Auf diese Weise wird ein nicht autorisierter Benutzer Ihrer API zu viel mehr Arbeit gezwungen.
Denken Sie beim Laden des JS-Clients an einige HTTP-Header (der Benutzeragent fällt mir ein) und die IP-Adresse und fordern Sie bei Änderungen eine erneute Authentifizierung an. Verwenden Sie dabei Blacklists für die üblichen Verdächtigen. Dies zwingt einen Angreifer, seine Hausaufgaben noch einmal gründlicher zu machen.
Denken Sie auf der Serverseite an die letzten API-Aufrufe und prüfen Sie vor dem Zulassen eines weiteren Aufrufs, ob die Geschäftslogik den neuen zulässt: Dies verweigert einem Angreifer die Möglichkeit, viele seiner Sitzungen auf eine Sitzung mit Ihrem Server zu konzentrieren: In In Kombination mit den anderen Maßnahmen ist ein Missbraucher leicht erkennbar.
Ich hätte das vielleicht nicht mit der nötigen Klarheit gesagt: Ich halte es für unmöglich , es einem Missbraucher völlig unmöglich zu machen, Ihren Dienst zu konsumieren, aber Sie können es so schwer machen, dass es den Aufwand möglicherweise nicht wert ist.
quelle
Sie sollten eine Art Authentifizierungssystem implementieren. Eine gute Möglichkeit, damit umzugehen, besteht darin, einige erwartete Header-Variablen zu definieren. Beispielsweise können Sie einen Auth / Login-API-Aufruf haben, der ein Sitzungstoken zurückgibt. Bei nachfolgenden Aufrufen Ihrer API wird erwartet, dass ein Sitzungstoken in einer HTTP-Headervariablen mit einem bestimmten Namen wie "your-api-token" festgelegt wird.
Alternativ erstellen viele Systeme Zugriffstoken oder Schlüssel, die erwartet werden (wie YouTube, Facebook oder Twitter), mithilfe eines API-Kontosystems. In diesen Fällen müsste Ihr Client diese auf irgendeine Weise im Client speichern.
Dann müssen Sie lediglich eine Prüfung für die Sitzung in Ihr REST-Framework einfügen und eine Ausnahme auslösen. Wenn möglich, wäre der Statuscode (um sich zu erholen) ein 401-Fehler.
quelle
Es gibt jetzt einen offenen Standard namens "JSON Web Token".
Siehe https://jwt.io/ & https://en.wikipedia.org/wiki/JSON_Web_Token
quelle
Entschuldigen Sie @MarkAmery und Eugene, aber das ist falsch.
Ihre im Browser ausgeführte js + html (Client) -App kann so eingerichtet werden, dass nicht autorisierte direkte Aufrufe der API wie folgt ausgeschlossen werden:
Während der Authentifizierung wird ein "Token" zurückgegeben.
Nach der Authentifizierung werden nur API-Aufrufe mit dem Authentifizierungstoken akzeptiert.
Zu diesem Zeitpunkt können natürlich nur autorisierte Benutzer mit dem Kennwort auf die API zugreifen. Wenn sie jedoch Programmierer sind, die die App debuggen, können sie zu Testzwecken direkt darauf zugreifen.
Um Ihre API verwenden zu können, müssen sie zuerst den Client herunterladen und ihn tatsächlich in einem Browser ausführen. Erst nach erfolgreichem Empfang des Rückrufs und anschließender Benutzereingabe innerhalb kurzer Zeit akzeptiert die API Anrufe.
Sie müssen sich also keine Sorgen machen, dass dies ein nicht autorisierter Benutzer ohne Anmeldeinformationen ist.
(Der Titel der Frage "Wie sichere ich REST-API-Aufrufe?" Und nach den meisten Ihrer Aussagen ist dies Ihr Hauptanliegen und nicht die wörtliche Frage, wie Ihre API aufgerufen wird, sondern von wem, richtig? )
quelle
Legen Sie eine SESSION-Variable auf dem Server fest, wenn der Client Ihre
index.html
(oderbackbone.js
usw.) zum ersten Mal lädt .Überprüfen Sie diese Variable auf der Serverseite bei jedem API-Aufruf.
PS das ist keine "Sicherheits" -Lösung !!! Dies dient nur dazu, die Belastung Ihres Servers zu verringern, damit die Benutzer ihn nicht missbrauchen oder Ihre API von anderen Websites und Apps aus "verlinken".
quelle
Folgendes mache ich:
Sichern Sie die API mit einem HTTP-Header mit Aufrufen wie X-APITOKEN:
Verwenden Sie Sitzungsvariablen in PHP. Verfügen Sie über ein Anmeldesystem und speichern Sie das Benutzertoken in Sitzungsvariablen.
Rufen Sie JS-Code mit Ajax zu PHP auf und verwenden Sie die Sitzungsvariable mit curl, um die API aufzurufen. Auf diese Weise wird die Sitzungsvariable nicht aufgerufen, wenn sie nicht festgelegt ist, und der PHP-Code enthält das Zugriffstoken für die API.
quelle