2010-11-30 12 views
3

Wenn sich der Benutzer über das Popup-Fenster von FB.login() bei Facebook anmeldet, erstellt JS SDK in meiner Domain ein Cookie, das oauth access_token im Klartext enthält. Dann wird dieser Cookie mit jeder weiteren Anfrage an meinen Server gesendet - und es ist ziemlich offensichtlich, dass nicht jede Anfrage https verwendet.Facebook JS SDK: access_token im Klartext und Sicherheit

Ist das nicht ein Sicherheitsproblem? Wenn ja, wie löst man es dann?

Antwort

2

Ein Angreifer, die in der Lage ist, den Netzwerkverkehr zu schnuppern (zB ein drahtloser lan), kann den Cookie lesen. Und tu so, als sei sie die Person, für die sie geschaffen wurde.

Dies ist nicht wirklich ein Problem, da der gleiche Angriff auf den Facebook-Seiten selbst funktioniert: Nur der Benutzername/Passwort - Authentifizierung erfolgt über https. Alle folgenden Seiten verwenden unverschlüsselte http, die den Cookie enthalten.

Es ist eine einfach zu bedienendes Firefox-Erweiterung, die von Cookies ermöglicht stähle, wenn Sie in der Lage sind, den Netzwerkverkehr zu schnuppern: http://codebutler.com/firesheep

PS: stackoverflow.com ist verwundbar, auch.

+0

Danke. Ich war so besorgt über den FB-Keks, dass ich übersehen habe, dass jeder andere Keks auch entführt werden kann, was mein Anliegen irrelevant macht, da es meinen ernsteren im Garten gibt! –

3

Es ist kein Problem, weil Sie die Echtheit des Cookies überprüfen können. Facebook enthält einen Wert namens sig mit jedem Cookie. Ich werde nicht auf alle Details eingehen, aber im Grunde, fügen Sie Ihr API-Geheimnis an den Cookie an, entfernen Sie den sig-Wert, hacken Sie den Cookie-Wert und verifizieren Sie, dass der Hash mit dem sig übereinstimmt. Da Sie und Facebook die einzigen sind, die den Wert des API-Geheimnisses kennen, können Sie sicher sein, dass der Cookie nicht manipuliert wurde.

Die andere Seite der Dinge, der Benutzer, der den Inhalt des Kekses betrachtet, spielt keine Rolle. Der Cookie enthält nur ein Zugriffstoken, das diesem Benutzer zugeordnet ist. Wenn der Benutzer versucht, den Cookie zu manipulieren, wird nur das Cookie ungültig. Und ihr Zugangstoken ermöglicht ihnen ohnehin nur den Zugriff auf ihr eigenes Konto.

Das Wichtigste ist zu überprüfen, ob der Cookie authentisch ist. Viele Leute tun das nicht und verursachen große Sicherheitsprobleme. Zum Beispiel enthält das Cookie die Facebook-Benutzer-ID. Sagen wir, ich bekomme diese Benutzer-ID und frage dann meinen Benutzer nach seiner Kreditkarte. Wenn ich diese Kreditkarte mit dieser Benutzer-ID speichere, aber das Cookie nicht validiere, könnte jeder reinkommen und den Benutzer-ID-Wert in seinem Cookie ändern und Zugriff auf private Daten erhalten. Wenn ich jedoch das Cookie mit dem API-Geheimnis verifiziere, würde ich wissen, ob der Cookie manipuliert wurde.

Hier ist, wie wir das Cookie in meinem Facebook C# SDK (http://facebooksdk.codeplex.com) validieren:

 /// <summary> 
     /// Validates a session_version=3 style session object. 
     /// </summary> 
     /// <param name="session">The session to validate.</param> 
     protected override void ValidateSessionObject(FacebookSession session) 
     { 
      if (session == null) 
      { 
       return; 
      } 

      var signature = this.GenerateSignature(session); 
      if (session.Signature == signature.ToString()) 
      { 
       return; 
      } 

      session = null; 
     } 

     /// <summary> 
     /// Generates a MD5 signature for the facebook session. 
     /// </summary> 
     /// <param name="session">The session to generate a signature.</param> 
     /// <returns>An MD5 signature.</returns> 
     /// <exception cref="System.ArgumentNullException">If the session is null.</exception> 
     /// <exception cref="System.InvalidOperationException">If there is a problem generating the hash.</exception> 
     protected override string GenerateSignature(FacebookSession session) 
     { 
      var args = session.Dictionary; 
      StringBuilder payload = new StringBuilder(); 
      var parts = (from a in args 
         orderby a.Key 
         where a.Key != "sig" 
         select string.Format(CultureInfo.InvariantCulture, "{0}={1}", a.Key, a.Value)).ToList(); 
      parts.ForEach((s) => { payload.Append(s); }); 
      payload.Append(this.ApiSecret); 
      byte[] hash = null; 
      using (var md5 = System.Security.Cryptography.MD5CryptoServiceProvider.Create()) 
      { 
       if (md5 != null) 
       { 
        hash = md5.ComputeHash(Encoding.UTF8.GetBytes(payload.ToString())); 
       } 
      } 

      if (hash == null) 
      { 
       throw new InvalidOperationException("Hash is not valid."); 
      } 

      StringBuilder signature = new StringBuilder(); 
      for (int i = 0; i < hash.Length; i++) 
      { 
       signature.Append(hash[i].ToString("x2", CultureInfo.InvariantCulture)); 
      } 

      return signature.ToString(); 
     } 
+0

Der Angriff soll den Keks von jemand anderem kopieren und so tun, als ob er das Opfer wäre. Die Bestätigung wird bestätigen, dass es gültig ist. –

+0

Ich meinte, was 'nhnb' geschrieben hat, aber ich schätze deine Antwort auch. –