2010-04-07 7 views
22

Manchmal stoße ich auf bestimmte Webentwicklungs-Frameworks, die keine Authentifizierungsfunktion bieten, z. B. in Authentication ASP.NET.Best Practice zur Implementierung eines sicheren "Remember Me"

Ich habe mich gefragt, welche Sicherheitsmaßnahmen bei der Implementierung von "Remember Me" Login-Funktionen durch Handcodierung berücksichtigt werden müssen?

Hier sind die Dinge, die ich in der Regel tun:

  1. Bewahren Sie den Benutzernamen in Cookie. Der Benutzername ist nicht verschlüsselt.

  2. Speichern Sie einen geheimen Schlüssel in einem Cookie. Der geheime Schlüssel wird unter Verwendung der Einwegfunktion basierend auf dem Benutzernamen erzeugt. Der Server überprüft den geheimen Schlüssel anhand des Benutzernamens, um sicherzustellen, dass dieser Benutzername nicht geändert wird.

  3. Verwenden Sie HttpOnly in Cookie. http://www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html

ich sonst noch etwas verpasst haben, die möglicherweise ein Sicherheitslücken führen könnte?

Antwort

17

Der Cookie sollte immer ein zufälliger Wert sein, der abläuft. Es gibt Fälle, in denen Sie den Status als Cookie-Wert speichern können und es keine Sicherheitsgefahr darstellt, wie z. B. die vom Benutzer bevorzugte Sprache, aber dies sollte so weit wie möglich vermieden werden. HttpOnlyCookies einschalten, ist eine großartige Idee.

Lesen Sie A3: "Fehlerhafte Authentifizierung und Sitzungsverwaltung" in der OWASP top 10 for 2010. Ein wichtiger Punkt in diesem Abschnitt ist, dass https für die gesamte Sitzung verwendet werden muss. Wenn die Sitzung sehr lange dauert, ist dies noch wichtiger.

Denken Sie auch daran, dass "Remember Me" ein großes Fenster erstellt, in dem ein Angreifer auf der Sitzung "reiten" kann. Dies gibt einem Angreifer eine sehr lange Zeit (Monate?), In der er einen CSRF-Angriff durchführen kann. Selbst wenn Sie einen CSRF-Schutz haben, kann ein Angreifer immer noch mit XSS und XmlHttpRequest auf einer Sitzung reiten (HttpOnlyCookies wird einen vollständigen Hijack verhindern). "Remember Me" macht andere Bedrohungen wie XSS, CSRF, Sniffing ernster. Solange diese Schwachstellen behoben wurden, sollten Sie kein Problem mit echten Hackern haben.

Die einfachste (und sichere) Ansatz eines „remember me“ -Funktion wäre zu modifizieren, um das Session-Timeout Ihre web.config-Datei zu implementieren:

<configuration> 
     <system.web> 
      <sessionState timeout="60"/> 
      </sessionState> 
     </system.web> 
    </configuration> 

Du das Timeout auf etwas hoch, vielleicht einen Monat oder damit. Wenn das Kontrollkästchen "Remember Me" deaktiviert ist, speichern Sie eine Sitzungsvariable mit einem normalen Timeout (wie 24 Stunden). Überprüfen Sie diese Sitzungsvariable in einer Headerdatei für jede Anforderung. Wenn das Kontrollkästchen aktiviert ist, dann handeln Sie normal und lassen Sie asp.net sich darum kümmern.

Wenn die Sitzung nicht abläuft, wird es viel einfacher, Gewalt zu bruten. Diese Werte sind groß, aber ein Hacker kann Jahre damit verbringen, eine Session-ID zu erraten, ist eine Schwachstelle.

+3

Große Antwort. Das einzige, was ich hinzufügen werde, ist Vorkehrungen zu treffen, um XSS und CSRF zu verhindern. Beide Probleme werden wichtig, wenn Sie lange Sitzungen haben. –

+0

@Srim Ich stimme dir vollkommen zu. (+1) – rook

Verwandte Themen