PHP Login - mehrfacher Login auf ein Account verhindern.
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anfangen
browser
datenbank
dieb
einloggen
ermitteln
erstellen
kopieren
login
methode
minute
router
session
speichern
status
stunden
url
verhindern
zahl
zeile
-
Hallo LC,
Ich habe einen Login script auf meiner Seite. Dieser basiert auf einem session cookie.
Meine Frage ist : Wie kann ich es verhindern das sich 2 PC's in ein Account einloggen?
Wäre cool wenn ihr mir einen Tipp geben könnten.
LG -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Dieses Thema könnte dir eventuell ein wenig auf die Sprünge helfen.
-
Was für ein Quatsch mit IP-Adresse und Hash und so ein Müll. Erstmal sind IP-Adressen nicht zwingend eindeutig. (Wenn zwei Rechner hinter einem Router sitzen, haben sie die gleiche IP) und der Hash davon ist sowieos unsinn und sicherheitstechnisch ein Scheunentor.
Ganz einfach: In eine Datenbank eintragen, ob der User eingeloggt ist. Beim einloggen wird der Wert auf true gesetzt, beim ausloggen auf false. Wenn der Benutzer bereits eingeloggt ist, wird der Login verweigert. So einfach ist das.
Dann kann man das ganze noch verfeinern, indem man eine "Last Activity"-Spalte dazu nimmt. Falls Loggedin&&(lastActivity kürzer her als 5 Minuten) dann Login verweigert.
Beitrag zuletzt geändert: 19.8.2010 22:43:01 von nerdinator -
der Session-Cookie sollte das eigentlich verhindern solange jedes mal beim einloggen eine neue session-id vergeben wird.
von lordcodex-methode würde ich abraten, aus dem grund den er Dir selber genannt hat.
Hat ein "Hacker" erst einmal diese session-id UND dieselbe ip UND denselben Browser, gibt es keine (mir) bekannte Methode Ihn abzuwehren.
Beim einloggen:
-EINZIGARTIGE session-id erstellen und in der user-db speichern
-ip ermitteln und in derselben Zeile speichern
-Browser ermitteln und in derselben Zeile speichern
-zusätzluich user-id und timestamp speichern
klickt jm auf eine geschützte Seite holst Du Dir session-cookie+browser+ip
stimmt alles überein prüfst Du noch ob der timestamp älter als (sagen wir) 30 Minuten ist
Wenn NICHT, timestamp mit der aktuellen Zeit+Datum überschreiben und Seite zeigen
Will jemand mit dieser user id und diesem pw einloggen und der "wirkliche" user hat sich noch nicht ausgeloggt (und war in den letzten 30 minuten aktiv) kannst du das einloggen noch zusätzlich verhindern.
Edit: dat mit dem Browser kannste eitgtl auch weglassen ist nur für übervorsichtige
Beitrag zuletzt geändert: 19.8.2010 22:55:45 von simuliertes -
simuliertes schrieb:
Das ganze verhindert nicht, dass man sich von 2 PC's gleichzeitig einloggt. Nimmt man einen User, der hinter einem Router mit 2 PC's sitzt, kann dieser ohne weiteres die Session-ID kopieren, den gleichen Browser benutzen (Das ist sogar allgemein üblich) und so weiter.
Beim einloggen:
-EINZIGARTIGE session-id erstellen und in der user-db speichern
-ip ermitteln und in derselben Zeile speichern
-Browser ermitteln und in derselben Zeile speichern
-zusätzluich user-id und timestamp speichern
klickt jm auf eine geschützte Seite holst Du Dir session-cookie+browser+ip
stimmt alles überein prüfst Du noch ob der timestamp älter als (sagen wir) 30 Minuten ist
Wenn NICHT, timestamp mit der aktuellen Zeit+Datum überschreiben und Seite zeigen
Vor allem die IP ist absoluter Quatsch, da a) die IP für gewöhnlich alle 24 Stunden wechselt und b) in keinster Weise eindeutig ist. Man sichert einfach die Session über die IP - mehr kann man damit dann auch nicht anfangen.
Soweit ich den TE aber verstehe, geht es ihm darum, zwei (gleichzeitige?) Logins von zwei PC's zu verhindern. Ganz ohne Hacker-Futzi-Wasweissich-Hintergrund. Und da kann man sich die IP getrost dahin stecken, wo keine Sonne scheint.
Wie bereits erwähnt:
a) Wenn User eingeloggt, dann sowieso schonmal kein Login.
Man kann sich also nicht mehr per Passwort einloggen, sondern muss schon die Session-ID kopieren.
b) Wenn die letzte Aktivität des Benutzers mehr als 5 Minuten her ist, wird die Session automatisch beendet.
Dies kann als Schutz eingesetzt werden, falls beispielsweise nach einer 24-Stunden-Trennung die Session ungültig wird oder man schlicht vergessen hat, den "Ausloggen"-Button zu drücken, bevor man den PC wechselt.
c) Man kann zufallszahlen bei jedem Seitenaufruf generieren, welche dann ein mal im Cookie gespeichert werden und zum anderen in der Session. Wenn der Wert im Cookie dann dem Wert in der Session entspricht, wird eine neue Zahl generiert und so weiter.
Dies führt dazu, dass wenn zwei Personen auf der Seite rumklicken, sie ständig zwei verschiedene Werte im Cookie haben. Person a klickt auf Link xyz, bekommt die Zahl 123 zugewiesen, was dann auch in der Session steht. Bei Person b steht aber noch die Zahl 456 im Cookie, also stimmen die Zahlen nichtmehr überein und die Session wird beendet. So muss man den Cookie wirklich bei jedem Seitenaufruf erstmal kopieren. Nahezu unmöglich zu veranstalten.
Wenn man dann noch Ajax dazu nimmt, lässt sich das ganze noch auf die Spitze treiben. Denn dann sind die Zufallszahlen nie älter als 5 oder 10 Sekunden.
Der Schutz gegen "Hacker" führt lediglich über einen sicheren Login. Passwort-Daten per Javascript verschlüsseln, bevor sie gesendet werden und am Webserver dann erst wieder entschlüsseln. Dafür gibt es ausreichend Varianten. Der Schutz der eigenen Sessions und so weiter liegt beim Endbenutzer. Daran kann der Seitenbetreiber herzlich wenig machen. Es gibt keine Variante der eindeutigen Identifikation. -
nerdinator schrieb:
Das ganze verhindert nicht, dass man sich von 2 PC's gleichzeitig einloggt. Nimmt man einen User, der hinter einem Router mit 2 PC's sitzt, kann dieser ohne weiteres die Session-ID kopieren, den gleichen Browser benutzen (Das ist sogar allgemein üblich) und so weiter.
Vor allem die IP ist absoluter Quatsch, da a) die IP für gewöhnlich alle 24 Stunden wechselt und b) in keinster Weise eindeutig ist. Man sichert einfach die Session über die IP - mehr kann man damit dann auch nicht anfangen.
Klar wechselt die ip alle 24 Stunden aber Du schlägst ja selber vor den User nach 5 Minuten ohne Aktivität auszuloggen (ich war bei 30 Minuten).
Also ist die ip ein sehr wirksames Mittel um zu verhindern das, (wie ich bereits sagte) sich jm mit der session-id von einem anderen pc aus einloggt.
Wenn ich mich richtig erinnere benutzt z.B. das Forum-system phpBB die ip als absicherung.
Und ich erinnere mich das es wirklich seeehr selten vorkam das mich das System wegen einem ip-wechsel rausgeschmissen hat.
Mal kurz gegoogelt:
Always ensure that IP address is used together with session key after a user has logged into your portal. This can prevent Session attacks
Quelle:http://hungred.com/useful-information/php-secure-login-tips-and-tricks/
Also wohl doch kein Quatsch & das man sich die ip sonstwo hinschieben kann sondern schlicht Ansichtssache.
Ganz abgesehen davon das solche Kommentare nicht gerade eine gute Kommunikation fördern.
Ich bleibe dabei diese methode (auch!) zu empfehlen, es sei denn es ging ihm wirklich nur darum, was er macht wenn 2 Pc's ohne böse Absicht einloggen wollen (wie Du ja bereits sagtest).
edit:
Man sichert einfach die Session über die IP - mehr kann man damit dann auch nicht anfangen.
btw. mehr als das habe ich ja auch nicht gesagt oder was verstehst du unter "sichern"?
Beitrag zuletzt geändert: 20.8.2010 22:00:07 von simuliertes -
Ich lese mir jetzt nicht alles durch, aber ich meine, eine Idee zu haben:
Loggt sich ein User ein, wird sein Onlinestatus oder was auch immer in der Datenbank auf 1 gesetzt. Dieser Wert existiert so lange, bis die Session terminiert wird d.h. wenn er zu lange inaktiv ist.
Nun wird jedoch beim Login geprüft, welchen Onlinestatus der einloggende User besitzt. Ist der Status 1, ist ein Login nicht möglich. Der Status wird ja nur durch Inaktivität oder durch den Logout auf 0 gesetzt.
Ich hoffe, du kannst mir folgen.
<?PHP if (isset($_SESSION['user_id'])) { require('connect.php'); $result = mysql_query('SELECT COUNT(*) FROM user WHERE user_id='.$_SESSION['user_id'].' AND session_id='".mysql_real_escape_string(md5(session_id()))."'"); $login_status = mysql_result($result,0,0); if ($login_status == 0) { $_SESSION = array(); session_destroy(); setcookie(session_name(), '', time()-300, '/', '', 0); exit(); } } ?>
Möglichkeiten gibt es sicherlich viele...
Beitrag zuletzt geändert: 22.8.2010 23:01:50 von fabo -
fabo schrieb:
Wenn er jetzt aber zusätzlich noch zusätzliche Session / Cookie werte hat die sich z.B. bei jedem Seitenaufruf ändern gibt es ein "kleines" Problem.
Loggt sich ein User ein, wird sein Onlinestatus oder was auch immer in der Datenbank auf 1 gesetzt. Dieser Wert existiert so lange, bis die Session terminiert wird d.h. wenn er zu lange inaktiv ist.
Nun wird jedoch beim Login geprüft, welchen Onlinestatus der einloggende User besitzt. Ist der Status 1, ist ein Login nicht möglich. Der Status wird ja nur durch Inaktivität oder durch den Logout auf 0 gesetzt.
User logt sich ein und liest sich auf einer Seite etwas durch. ACC-Dieb klaut seine Session Werte und ggf. auch die Cookie-Werte. Nun klickt sich der Acc-Dieb auf ne andere Seite mit diesen Werten und erhält natürlich neue / aktuelle Werte die z.B. in die Datenbank geschrieben werden oder halt verglichen werden. Nun Surft der ACC-Dieb mit diesen ACC. Der User hat sich alles durchgelesen und möchte nun weiter klicken, da seine Werte nun "alt" sind wird er als möglicher ACC-Dieb erkannt und er ist nun nicht mehr mit seinen Acc Online, aber der Dieb schon, das heißt der User kann sich so oft versuchen sich einzuloggen wie er will, er kann es durch deine tolle Maßnahme nicht da der Dieb ja noch offiziell mit seinem Acc unterwegs ist.
Hoffe du weißt was ich meine -
Prinzipiell stimmt das, jedoch bezieht sich meine Methode auf eine Verfahrensweise, bei der das Cookie bzw. die Session nur zweitrangig ist.
Alles in Allem halte ich es sowieso für Schwachsinn, ein solches Verfahren anzuwenden. Das macht das Ganze genau so sicher, wie als wenn man es nicht so täte. Dafür macht es alles im Zweifelsfalle umständlicher. -
Kannst du dann deine Methode mal etwas genauer erläutern?
Ich Persönlich setze eine selbst erstellte Session in ein Cookie, dann speichere ich die Session, den Browser und die IP in die Datenbank, auf jeder Seite wird das ganze nun überprüft und ein neuer Wert vergeben. selbst wenn die Session entwendet wird kann sich der User neu Anmelden und der Dieb würde aus dem System wieder heraus geschmissen. Zudem muss man um Userdaten zu ändern vorher sein Passwort eingeben, so hat der Dieb keine Chance da irgend etwas zu verändern. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage