2012-06-17 5 views
13

I PHP library for OAuth2.0 v20OAuth2.0 Server-Stapel Wie verwendet man CSRF, um den Status zu verhindern? für Draft 2.0 v20

In draft20 verwende, gibt es eine mention of the use of state to prevent CSRF

Bisher meine eigene Web-Anwendung, die diese PHP-Bibliothek implementiert ermöglicht folgendes:

  1. 3 legged authentication using Authorization Code Request
  2. 2 legged authentication using Resource Owner Credentials Grant
  3. a Request that refreshes an access token

Muss ich den Status für alle 3 obigen Situationen verwenden?

Wenn ja, was ist ein gutes Beispiel für „Staat“?

, was einen guten „Zustand“ macht?

Jede ideale Länge? Irgendeine minimale Länge? Jede maximale Länge?

Jede ideale Make-up? alphanumerisch einschließlich Großbuchstaben?

Antwort

14

Nur für # 1 - 3-legged Autorisierung mit Autorisierungscode Fluss.

Wenn Ihre Anwendung den Autorisierungscode für ein Zugriffstoken austauscht, möchten Sie sicherstellen, dass der OAuth-Fluss, der zu dem bereitgestellten Autorisierungscode geführt hat, tatsächlich vom rechtmäßigen Benutzer initiiert wurde. Bevor die Clientanwendung den OAuth-Flow startet, indem sie den Benutzer an den Provider weiterleitet, erstellt die Clientanwendung einen zufälligen Statuswert und speichert ihn in der Regel in einer serverseitigen Sitzung. Wenn der Benutzer den OAuth-Flow abgeschlossen hat, überprüfen Sie, ob der Statuswert mit dem in der serverseitigen Sitzung des Benutzers gespeicherten Wert übereinstimmt. Dies weist darauf hin, dass der Benutzer den OAuth-Flow initiiert hat.

Ein Zustandswert sollte typischerweise ein pseudo-zufällige unguessable Wert sein. Ein einfacher Wert kann als ein int mit der Funktion rand() in PHP erzeugt werden, obwohl Sie auch komplexer werden könnten, um eine größere Sicherheit zu bieten.

Der Status existiert, um Dinge wie mich zu verhindern Ihnen einen Link per E-Mail senden, die einen Autorisierungscode für mein Konto enthält, klicken Sie darauf und die Anwendung schiebt alle Daten in mein Konto unbemerkt von Ihnen.

Einige zusätzliche Informationen im OAuth 2.0 Bedrohungsmodell Dokument: http://tools.ietf.org/html/draft-ietf-oauth-v2-threatmodel-00

Insbesondere finden Sie im Abschnitt über die CSRF-Schutz: http://tools.ietf.org/html/draft-ietf-oauth-v2-26#section-10.12

+0

Sie erstellen einen Zufallswert Zustand und in der Regel speichert sie in einer serverseitigen Sitzung. Wer ist das "du"? die Client-App? der OAuth-Autorisierungsserver? –

+0

Was sollte die ideale Länge des staatlichen Wertes sein? Irgendeine minimale Länge? oder maximale Länge? –

+0

Die Client-App erstellt es und überprüft es. Der OAuth-Autorisierungsserver führt nur die Weiterleitung durch. –

0

Als „Staat“ ist nur eine zufällige Zeichenfolge, so dass etwas wie das sollte den Trick tun:

Denken Sie daran, es in Ihrer Sitzung zu speichern, so dass Sie es später überprüfen können.

+2

-1. http://php.net/manual/en/function.mt-rand.php: "Vorsicht Diese Funktion erzeugt keine kryptographisch sicheren Werte und sollte nicht für kryptografische Zwecke verwendet werden. Wenn Sie einen kryptografisch sicheren Wert benötigen, beachten Sie Verwenden Sie stattdessen random_int(), random_bytes() oder openssl_random_pseudo_bytes(). " – thejh

+1

warum bearbeiten Sie es nicht und geben Sie den richtigen Weg? – Michelle

29

Es könnte hilfreich sein, ein Beispiel zu Schritt durch CSRF nutzen, um zu verstehen, wie ein Zustandsparameter einen solchen Angriff mildert.In diesem Beispiel Mallory ist der Angreifer und Alice ist die Opfer.

Der Angriff

  1. Mallory Besuche einige Client Website und startet den Prozess, dass die Client zu genehmigen einige Dienstanbieter für den Zugriff auf mit OAuth

  2. Der Client fragt den Service-Provider für die Erlaubnis, um Zugriff auf Mallory's Auftrag zu beantragen, der gewährt wird

  3. Mallory ist redi giert auf der Website des Dienstanbieters, wo sie normalerweise ihr Benutzername/Passwort, um Zugang

  4. geben würde statt zu genehmigen, verhindert Mallory Fallen/diese Anforderung und speichert seine URL

  5. nun Mallory bekommt irgendwie Alice besuche diese URL. Wenn Alice angemeldet ist mit ihrem eigenen Konto zu dem Service-Provider, dann ihre Anmeldeinformationen wird eine Autorisierungscode

  6. Der Autorisierungscode zur Ausgabe verwendet werden, für die ein Zugriffstoken ausgetauscht

  7. Jetzt Mallorys Konto auf dem Client ist berechtigt Alices Konto auf dem Service-Provider für den Zugriff auf

Also, wie verhindern wir das mit dem Parameter state?

Prävention

  1. Der Kunde sollte einen Wert schaffen, die irgendwie auf dem ursprüngliche Benutzerkonto basiert (ein Hash des Sitzungsschlüssels des Benutzers, zum Beispiel). Es spielt keine Rolle, was es ist, solange es unique ist und mit einigen privaten, unverantwortlichen Informationen über den ursprünglichen Benutzer generiert wird.

  2. Dieser Wert wird an den Service Provider in der Umleitung von Schritt über

  3. nun drei vergangen, als Mallory Alice die gespeicherte URL (Schritt fünf oben) besuchen wird, beinhaltet, dass URL der state Parameter erzeugt mit Mallorys Sitzungsinformationen

  4. der Autorisierungscode wird ausgegeben und zurück an den Client in Alice Sitzung zusammen mit Mallory state Parametern

  5. Der Client generiert einen neuen state Wert basierend auf Alice ' Sitzungsinformationen und vergleicht ihn mit dem Wert state, der von der Autorisierungsanforderung an den Dienstanbieter gesendet wurde.Dieser Wert entspricht nicht den state Parameter über den Antrag, weil der state Wert erzeugt wurde, basierend auf Mallorys Sitzungsinformationen, so dass er abgelehnt wird.

Ein Angreifer sollte einen Zustandswert zu erzeugen, für einen bestimmten Benutzer und daher nicht in der Lage sein, einen Benutzer in trickst ihre Berechtigung URL besuchen keine Wirkung.

+0

Als die Callback-URL meiner Anwendung aufgerufen wurde (aufgrund der Umleitung vom Dienstanbieter), schaue ich auf den Sitzungscookie (ein verschlüsseltes Cookie, das die ID des Benutzers enthält) und weiß, für welchen Benutzer der Zugriff gewährt wurde. Warum brauche ich in diesem Fall den Zustandsparameter? –

+0

Ordentlich erklärt, gute JOB :) – sudhnk

+0

scheint gut erklärt zu sein. vielleicht kannst du sagen wie mallory alice die url gibt und wie alice den berechtigungscode an mallory gibt (ihre client-instanz sollte das access token anfordern).Ich bekomme es nicht – iRaS

Verwandte Themen