it-swarm.com.de

Wie sichere ich mich? REST API-Aufrufe

Ich entwickle die restful-Web-App, die ein beliebtes Web-Framework im Backend verwendet, beispielsweise Rails, Sinatra, Flask, Express.js. Idealerweise möchte ich mit Backbone.js Client-Seite 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.

74
knd

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 Anfrage von einem zu senden Werkzeug seiner Wahl.

Das heißt, wenn ich Ihre Frage richtig lese, ist dies nicht das, was Sie vermeiden möchten: Was Sie wirklich nicht wollen, ist, dass Ihre API (regelmäßig) konsumiert wird, ohne dass Ihr JS-Client involviert ist. Im Folgenden finden Sie einige Vorschläge, wie Sie die Verwendung Ihres Clients zumindest fördern können, wenn Sie sie nicht erzwingen:

  • Ich bin sicher, Ihre API verfügt über eine Art Authentifizierungsfeld (z. B. auf dem Client berechnetes Hash). Wenn nicht, werfen Sie einen Blick auf Diese SO Frage . Stellen Sie sicher, dass Sie einen Salt-Schlüssel (oder sogar einen API-Schlüssel) verwenden, der Ihrem JS-Client auf Sitzungsbasis (unter anderem fest codiert) übergeben wird. Auf diese Weise wird ein nicht autorisierter Benutzer Ihrer API zu viel mehr Arbeit gezwungen.

  • Erinnern Sie sich beim Laden des JS-Clients an einige HTTP-Header (Benutzerprogramm fällt ein) und die IP-Adresse und fragen Sie nach einer erneuten Authentifizierung, falls sie sich ändern. 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, bevor Sie einen anderen zulassen, ob die Geschäftslogik jetzt den neuen zulässt: Dies verweigert einem Angreifer die Möglichkeit, viele seiner Sitzungen auf eine Sitzung mit Ihrem Server zu konzentrieren: In Kombination mit den anderen Maßnahmen wird dies einen Missbraucher leicht erkennbar machen.

Ich hätte das vielleicht nicht mit der nötigen Klarheit sagen können: Ich halte es für unmöglich , es einem Täter völlig unmöglich zu machen, Ihre Dienste in Anspruch zu nehmen, aber Sie können es tun es ist so schwer, dass es sich vielleicht nicht lohnt.

80
Eugen Rieck

Sie sollten eine Art Authentifizierungssystem implementieren. Ein guter Weg, um damit umzugehen, ist die Definition einiger erwarteter Header-Variablen. Sie können beispielsweise einen Aufruf für eine Auth/Login-API haben, der ein Sitzungstoken zurückgibt. Bei nachfolgenden Aufrufen Ihrer API wird davon ausgegangen, dass ein Sitzungstoken in einer HTTP-Header-Variablen mit einem bestimmten Namen wie "Ihr-api-Token" festgelegt wird.

Alternativ erstellen viele Systeme mithilfe eines API-Kontosystems Zugriffstoken oder -schlüssel, die erwartet werden (wie YouTube, Facebook oder Twitter). In diesen Fällen muss Ihr Client diese auf irgendeine Weise im Client speichern.

Dann müssen Sie einfach eine Prüfung für die Sitzung in Ihr REST - Framework einfügen und eine Ausnahme auslösen. Wenn überhaupt, wäre der Statuscode (um erholsam zu sein) ein 401-Fehler.

10
gview

Es gibt jetzt einen offenen Standard namens "JSON Web Token",

siehe https://jwt.io/ & https://en.wikipedia.org/wiki/JSON_Web_Token

JSON Web Token (JWT) ist ein auf JSON basierender offener Standard (RFC 7519) für Erstellen von Tokens, die einige Ansprüche geltend machen. Zum Beispiel eine Der Server könnte ein Token generieren, das den Anspruch "Als Administrator angemeldet" hat und das einem Kunden zur Verfügung stellen. Der Client könnte dieses Token dann für .__ verwenden. beweisen, dass sie als admin angemeldet sind. Die Token werden von der .__ signiert. Server-Schlüssel, so dass der Server überprüfen kann, dass das Token .__ ist. legitim. Die Token sind kompakt, URL-sicher und benutzbar insbesondere im Webbrowser für Single Sign-On (SSO). JWT-Ansprüche können wird normalerweise verwendet, um die Identität authentifizierter Benutzer zwischen einem .__ zu übergeben. Identitätsanbieter und ein Diensteanbieter oder jede andere Art von Ansprüchen wie von Geschäftsprozessen gefordert. [1] [2] Die Token können auch .__ sein. authentifiziert und verschlüsselt. [3] [4]

5
bbozo

Entschuldigen Sie @ MarkAmery und Eugene, aber das ist falsch.

Ihre js + html (client) -App, die im Browser ausgeführt wird, kann so eingerichtet werden, dass nicht autorisierte direkte Aufrufe der API wie folgt ausgeschlossen werden: 

  1. Erster Schritt: Richten Sie die API so ein, dass eine Authentifizierung erforderlich ist. DerClient muss sich zunächst über den Server (oder einen anderen Sicherheitsserver) authentifizieren zum Beispiel den Benutzer auffordern, das korrekte Kennwort anzugeben. 

Vor der Authentifizierung werden die Aufrufe der API nicht akzeptiert.  

Während der Authentifizierung wird ein "Token" zurückgegeben. 

Nach der Authentifizierung werden nur API-Aufrufe mit dem Authentifizierungs-Token akzeptiert. 

Natürlich können zu diesem Zeitpunkt nur autorisierte Benutzer, die über ein Kennwort verfügen, auf die API zugreifen, obwohl Programmierer, die die App debuggen, direkt zu Testzwecken darauf zugreifen können. 

  1. Zweiter Schritt: Richten Sie nun eine zusätzliche Sicherheits-API ein, die innerhalb einer kurzen Zeitspanne aufgerufen werden soll, nachdem die Client-Anwendung js + html vom Server ursprünglich angefordert wurde. Dieser "Rückruf" teilt dem Server mit, dass der Client erfolgreich heruntergeladen wurde. Schränken Sie Ihre REST - API-Aufrufe nur dann ein, wenn der Client kürzlich erfolgreich und erfolgreich angefordert wurde. 

Um Ihre API zu verwenden, müssen Sie zunächst den Client herunterladen und ihn tatsächlich in einem Browser ausführen. Erst nach erfolgreichem Empfang des Rückrufs und dann innerhalb kürzester Zeit durch den Benutzereintrag nimmt die API Aufrufe an. 

Sie müssen sich also keine Sorgen machen, dass dies möglicherweise ein nicht autorisierter Benutzer ohne Anmeldeinformationen ist. 

(Der Titel der Frage "Wie sichere ich REST API-Aufrufe"), und von den meisten Ihrer Aussagen ist dies Ihr Hauptanliegen und nicht die wörtliche Frage, wie Ihre API aufgerufen wird, sondern eher BY WEN, richtig?)

3
pashute

Folgendes mache ich:

  1. Sichern Sie die API mit einem HTTP-Header mit Aufrufen wie X-APITOKEN: 

  2. Verwenden Sie Sitzungsvariablen in PHP. Verfügen Sie über ein Anmeldesystem und speichern Sie das Benutzertoken in Sitzungsvariablen.

  3. Rufen Sie JS-Code mit Ajax an PHP auf und verwenden Sie die Sitzungsvariable mit curl, um die API aufzurufen. Wenn die Sitzungsvariable nicht gesetzt ist, wird sie nicht aufgerufen, und der Code PHP enthält das Zugriffstoken für die API. 

0
Pavneet Singh
  1. Legen Sie eine SESSION-Variable auf dem Server fest, wenn der Client Ihren index.html (oder backbone.js usw.) zum ersten Mal lädt.

  2. Überprüfen Sie diese Variable serverseitig bei jedem API-Aufruf.

P.S. Dies ist keine "Sicherheitslösung" !!! Dies dient lediglich dazu, den Server zu entlasten, damit Benutzer ihn nicht missbrauchen oder Ihre API von anderen Websites und Apps "Hotlinks" machen.

0
Alex