Alter Thread, aber immer noch ein berechtigtes Anliegen. Ich bemerkte einige gute Reaktionen in Bezug auf Sicherheit und die Vermeidung der Verwendung von "Sicherheit durch Dunkelheit", aber die tatsächlich angegebenen technischen Methoden reichten in meinen Augen nicht aus. Dinge, die ich sagen muss, bevor ich meine Methode beisteuere:
- Speichern Sie NIEMALS ein Passwort im Klartext ... NIEMALS!
- NOCH NIE speichert einen Hash - Passwort des Benutzers in mehr als ein Ort in Ihrer Datenbank. Ihr Server-Backend kann das Hash-Passwort immer aus der Benutzertabelle abrufen. Es ist nicht effizienter, redundante Daten anstelle zusätzlicher DB-Transaktionen zu speichern. Das Gegenteil ist der Fall.
- Ihre Sitzungs-IDs sollten eindeutig sein, damit keine zwei Benutzer jemals eine ID teilen können, daher der Zweck einer ID (könnte die ID-Nummer Ihres Führerscheins jemals mit einer anderen Person übereinstimmen? Nein.) Dies erzeugt eine zweiteilige eindeutige Kombination, basierend auf 2 einzigartige Saiten. Ihre Sitzungstabelle sollte die ID als PK verwenden. Verwenden Sie eine andere Tabelle für vertrauenswürdige Geräte, die die Liste aller validierten Geräte enthält (siehe mein Beispiel unten) und die unter Verwendung des Benutzernamens zugeordnet wird, damit mehreren Geräten für die automatische Anmeldung vertraut werden kann.
- Es hat keinen Zweck, bekannte Daten in ein Cookie zu hashen, das Cookie kann kopiert werden. Was wir suchen, ist ein kompatibles Benutzergerät, um authentische Informationen bereitzustellen, die nicht abgerufen werden können, ohne dass ein Angreifer den Computer des Benutzers kompromittiert (siehe auch mein Beispiel). Dies würde jedoch bedeuten, dass ein legitimer Benutzer, der die statischen Informationen seines Computers (z. B. MAC-Adresse, Hostname des Geräts, Benutzeragent, wenn durch den Browser eingeschränkt usw.) verbietet, nicht konsistent zu bleiben (oder diese überhaupt fälscht), dies nicht kann Verwenden Sie diese Funktion. Wenn dies jedoch ein Problem darstellt, berücksichtigen Sie die Tatsache, dass Sie Benutzern, denen Sie eine automatische Anmeldung anbieten, anbieten sich eindeutig identifizieren,Wenn sie sich also weigern, bekannt zu werden, indem sie ihren MAC fälschen, ihren Benutzeragenten fälschen, ihren Hostnamen fälschen / ändern, sich hinter Proxys verstecken usw., sind sie nicht identifizierbar und sollten niemals für einen automatischen Dienst authentifiziert werden. Wenn Sie dies möchten, müssen Sie sich mit dem Smartcard-Zugriff befassen, der mit einer clientseitigen Software gebündelt ist, die die Identität des verwendeten Geräts festlegt.
Abgesehen davon gibt es zwei großartige Möglichkeiten, sich automatisch auf Ihrem System anzumelden.
Erstens die billige, einfache Möglichkeit, alles auf jemand anderen zu übertragen. Wenn Sie dafür sorgen, dass sich Ihre Website beispielsweise mit Ihrem Google + -Konto anmeldet, haben Sie wahrscheinlich eine optimierte Google + -Schaltfläche, mit der sich der Nutzer anmeldet, wenn er bereits bei Google angemeldet ist (das habe ich hier getan, um diese Frage zu beantworten, wie ich es immer bin bei Google angemeldet). Wenn Sie möchten, dass sich der Benutzer automatisch anmeldet, wenn er bereits mit einem vertrauenswürdigen und unterstützten Authentifikator angemeldet ist, und das Kontrollkästchen aktiviert haben, lassen Sie Ihre clientseitigen Skripts vor dem Laden den Code hinter der entsprechenden Schaltfläche "Anmelden mit" ausführen Stellen Sie nur sicher, dass der Server eine eindeutige ID in einer Tabelle für die automatische Anmeldung speichert, die den Benutzernamen, die Sitzungs-ID und den für den Benutzer verwendeten Authentifikator enthält. Da diese Anmeldemethoden AJAX verwenden, warten Sie trotzdem auf eine Antwort. und diese Antwort ist entweder eine validierte Antwort oder eine Ablehnung. Wenn Sie eine validierte Antwort erhalten, verwenden Sie diese wie gewohnt und laden Sie den angemeldeten Benutzer wie gewohnt weiter. Andernfalls ist die Anmeldung fehlgeschlagen, aber teilen Sie dem Benutzer dies nicht mit. Fahren Sie einfach fort, da er nicht angemeldet ist. Er wird es bemerken. Dies soll verhindern, dass ein Angreifer, der Cookies gestohlen (oder gefälscht hat, um Berechtigungen zu eskalieren), erfährt, dass sich der Benutzer automatisch auf der Website anmeldet.
Dies ist billig und kann von einigen auch als schmutzig angesehen werden, da es versucht, Ihre möglicherweise bereits selbst angemeldeten Personen mit Orten wie Google und Facebook zu validieren, ohne es Ihnen zu sagen. Es sollte jedoch nicht für Benutzer verwendet werden, die nicht aufgefordert wurden, sich automatisch bei Ihrer Website anzumelden. Diese spezielle Methode dient nur zur externen Authentifizierung, z. B. bei Google+ oder FB.
Da ein externer Authentifikator verwendet wurde, um dem Server hinter den Kulissen mitzuteilen, ob ein Benutzer validiert wurde oder nicht, kann ein Angreifer nur eine eindeutige ID erhalten, die für sich genommen unbrauchbar ist. Ich werde näher darauf eingehen:
- Benutzer 'joe' besucht die Site zum ersten Mal, Sitzungs-ID in Cookie 'session' platziert.
- Benutzer 'joe' meldet sich an, eskaliert Berechtigungen, erhält eine neue Sitzungs-ID und erneuert das Cookie 'session'.
- Der Benutzer 'joe' wählt die automatische Anmeldung mit Google + und erhält eine eindeutige ID im Cookie 'keepmesignedin'.
- Der Nutzer 'joe' lässt Google sie anmelden, sodass Ihre Website den Nutzer mithilfe von Google in Ihrem Backend automatisch anmelden kann.
- Der Angreifer versucht systematisch eindeutige IDs für 'keepmesignedin' (dies ist öffentliches Wissen, das jedem Benutzer ausgehändigt wird) und ist an keiner anderen Stelle angemeldet. versucht eine eindeutige ID für 'joe'.
- Der Server erhält eine eindeutige ID für "Joe" und zieht eine Übereinstimmung in der Datenbank für ein Google + -Konto.
- Der Server sendet den Angreifer an die Anmeldeseite, auf der eine AJAX-Anforderung an Google ausgeführt wird, um sich anzumelden.
- Der Google-Server empfängt eine Anfrage und verwendet seine API, um festzustellen, dass der Angreifer derzeit nicht angemeldet ist.
- Google sendet eine Antwort, dass über diese Verbindung derzeit kein Benutzer angemeldet ist.
- Die Seite des Angreifers erhält eine Antwort. Das Skript leitet automatisch zur Anmeldeseite mit einem in der URL codierten POST-Wert weiter.
- Die Anmeldeseite erhält den POST-Wert, sendet das Cookie für 'keepmesignedin' an einen leeren Wert und ist bis zum Datum 1-1-1970 gültig, um einen automatischen Versuch zu verhindern, wodurch der Browser des Angreifers das Cookie einfach löscht.
- Der Angreifer erhält eine normale Anmeldeseite zum ersten Mal.
Selbst wenn ein Angreifer eine nicht vorhandene ID verwendet, sollte der Versuch bei allen Versuchen fehlschlagen, außer wenn eine validierte Antwort empfangen wird.
Diese Methode kann und sollte in Verbindung mit Ihrem internen Authentifikator für diejenigen verwendet werden, die sich mit einem externen Authentifikator auf Ihrer Website anmelden.
=========
Für Ihr eigenes Authentifizierungssystem, das Benutzer automatisch anmelden kann, gehe ich folgendermaßen vor:
DB hat ein paar Tabellen:
TABLE users:
UID - auto increment, PK
username - varchar(255), unique, indexed, NOT NULL
password_hash - varchar(255), NOT NULL
...
Beachten Sie, dass der Benutzername 255 Zeichen lang sein kann. Mein Serverprogramm hat Benutzernamen in meinem System auf 32 Zeichen beschränkt, aber externe Authentifikatoren haben möglicherweise Benutzernamen, deren @ domain.tld größer ist. Daher unterstütze ich nur die maximale Länge einer E-Mail-Adresse, um maximale Kompatibilität zu gewährleisten.
TABLE sessions:
session_id - varchar(?), PK
session_token - varchar(?), NOT NULL
session_data - MediumText, NOT NULL
Beachten Sie, dass diese Tabelle kein Benutzerfeld enthält, da sich der angemeldete Benutzername in den Sitzungsdaten befindet und das Programm keine Nulldaten zulässt. Die session_id und das session_token können mit zufälligen md5-Hashes, sha1 / 128/256-Hashes, Datums- / Uhrzeitstempeln mit zufälligen Zeichenfolgen, die dann gehasht werden, oder was auch immer Sie möchten generiert werden, aber die Entropie Ihrer Ausgabe sollte so hoch wie tolerierbar bleiben Verhindern Sie, dass Brute-Force-Angriffe überhaupt in Gang kommen, und alle von Ihrer Sitzungsklasse generierten Hashes sollten vor dem Versuch, sie hinzuzufügen, auf Übereinstimmungen in der Sitzungstabelle überprüft werden.
TABLE autologin:
UID - auto increment, PK
username - varchar(255), NOT NULL, allow duplicates
hostname - varchar(255), NOT NULL, allow duplicates
mac_address - char(23), NOT NULL, unique
token - varchar(?), NOT NULL, allow duplicates
expires - datetime code
MAC-Adressen sollten von Natur aus EINZIGARTIG sein, daher ist es sinnvoll, dass jeder Eintrag einen eindeutigen Wert hat. Hostnamen hingegen könnten legitimerweise in separaten Netzwerken dupliziert werden. Wie viele Leute verwenden "Home-PC" als einen ihrer Computernamen? Der Benutzername wird vom Server-Backend aus den Sitzungsdaten übernommen, sodass eine Manipulation nicht möglich ist. Für das Token sollte dieselbe Methode zum Generieren von Sitzungstoken für Seiten verwendet werden, um Token in Cookies für die automatische Anmeldung des Benutzers zu generieren. Zuletzt wird der Datum / Uhrzeit-Code hinzugefügt, wenn der Benutzer seine Anmeldeinformationen erneut validieren müsste. Aktualisieren Sie diese Datumszeit entweder bei der Benutzeranmeldung, indem Sie sie innerhalb weniger Tage beibehalten, oder erzwingen Sie den Ablauf, unabhängig von der letzten Anmeldung, und halten Sie sie nur etwa einen Monat lang, je nachdem, was Ihr Design vorschreibt.
Dies verhindert, dass jemand den MAC und den Hostnamen eines Benutzers, von dem er weiß, dass er sich automatisch anmeldet, systematisch fälscht. anmeldet, NIEMALSLassen Sie den Benutzer ein Cookie mit seinem Passwort, Klartext oder auf andere Weise aufbewahren. Lassen Sie das Token bei jeder Seitennavigation neu generieren, genau wie beim Sitzungstoken. Dies verringert massiv die Wahrscheinlichkeit, dass ein Angreifer ein gültiges Token-Cookie erhält und es zum Anmelden verwendet. Einige Leute werden versuchen zu sagen, dass ein Angreifer dem Opfer die Cookies stehlen und einen Sitzungswiederholungsangriff ausführen könnte, um sich anzumelden. Wenn ein Angreifer die Cookies stehlen könnte (was möglich ist), hätte er sicherlich das gesamte Gerät kompromittiert, was bedeutet, dass er das Gerät trotzdem nur zum Anmelden verwenden könnte, was den Zweck des vollständigen Diebstahls von Cookies zunichte macht. Solange Ihre Site über HTTPS läuft (was beim Umgang mit Passwörtern, CC-Nummern oder anderen Anmeldesystemen der Fall sein sollte), haben Sie dem Benutzer den Schutz gewährt, den Sie in einem Browser haben können.
Beachten Sie Folgendes: Sitzungsdaten sollten nicht ablaufen, wenn Sie die automatische Anmeldung verwenden. Sie können die Möglichkeit, die Sitzung fälschlicherweise fortzusetzen, auslaufen lassen. Bei der Validierung im System sollten jedoch die Sitzungsdaten fortgesetzt werden, wenn es sich um persistente Daten handelt, die voraussichtlich zwischen den Sitzungen fortgesetzt werden. Wenn Sie sowohl persistente als auch nicht persistente Sitzungsdaten möchten, verwenden Sie eine andere Tabelle für persistente Sitzungsdaten mit dem Benutzernamen als PK und lassen Sie den Server diese wie die normalen Sitzungsdaten abrufen. Verwenden Sie einfach eine andere Variable.
Sobald eine Anmeldung auf diese Weise erreicht wurde, sollte der Server die Sitzung noch validieren. Hier können Sie Erwartungen für gestohlene oder kompromittierte Systeme codieren. Muster und andere erwartete Ergebnisse von Anmeldungen an Sitzungsdaten können häufig zu Schlussfolgerungen führen, dass ein System entführt oder Cookies gefälscht wurden, um Zugriff zu erhalten. Hier kann Ihr ISS Tech Regeln festlegen, die eine Kontosperrung oder das automatische Entfernen eines Benutzers aus dem automatischen Anmeldesystem auslösen und Angreifer so lange fernhalten, dass der Benutzer feststellen kann, wie der Angreifer erfolgreich war und wie er sie abschneiden kann.
Stellen Sie abschließend sicher, dass Wiederherstellungsversuche, Kennwortänderungen oder Anmeldefehler nach dem Schwellenwert dazu führen, dass die automatische Anmeldung deaktiviert wird, bis der Benutzer ordnungsgemäß validiert und bestätigt hat, dass dies geschehen ist.
Ich entschuldige mich, wenn jemand erwartet hat, dass in meiner Antwort Code ausgegeben wird, das wird hier nicht passieren. Ich werde sagen, dass ich PHP, jQuery und AJAX verwende, um meine Websites auszuführen, und Windows NIEMALS als Server verwende ... niemals.