Loginbereich absichern [php]

Hi,

ich bin grad dabei für ne Seite nen Loginbereich zu erstellen, jetzt dachte ich mir, ich frag mal so in die Runde wie ihr das ganze so absichert. Damit die eingaben geprüft werden sollen, und Passwort verschlüsselt abgespeichert werden soll ist klar.

Am sichersten wäre ja denke ich Session + IP vergleich(mysql-db),

folgende Probleme stellen sich mir jetzt erstmal gedanklich:

IP wechselt alle 24 (alternativ - nur die ersten 6 Zahlen vergleichen)
Dauerlogin sollte möglich sein, und dennoch sicher

ich schätze den Dauerlogin realisiert man am besten über cookies oder?

Die IP kann sich auch von einem Request zum nächsten schon geändert haben, wenn der Nutzer über verschiedene Proxies zugreift. (Muss er nicht freiwillig machen, teilweise sorgen auch die Zugangsprovider dafür.)

Ja, wobei sich dann erst die eigentlich interessante Frage stellt, was man in diesen Cookie reinschreibt. Sollte auf jeden Fall auch irgendein Hash sein, keinesfalls nachvollziehbare Daten wie Username und/oder Passwort.

Und „ewig“ sollte der Cookie auch nicht leben, maximal ein paar Tage.

Hi,

also ich habe schonmal das hier gefunden: http://www.tutorials.de/forum/php-tutorials/9684-php-mysql-login-system-mit-sessions.html
Ich finde das ist gut zu verstehen und es funktioniert.
Vielleicht kann man ja dazu mal was sagen ob das sicher ist, wenn nein warum nicht und wie man es verbessern könnte.

Gruß Nikolas

Die fehlende Absicherung gegen SQL Injection ist das größte Manko, das sofort ins Auge fällt.

Und damit kann man dieses Tutorial gleich in die Kategorie „Finger von lassen“ einordnen; ganz abgesehen von weiteren Mängeln wie fehlender Fehlerbehandlung etc.

zu IP: wollte eigenlich schreiben normalerweise spätestens alle 24 Std(Zwangstrennung Provider) aber war mir dann doch zu ausführlich.

zum Cookie:

genau jetzt sind wir an dem Punkt den auch ich meine:

Ich am besten wäre ja irgendein einzigartiger “Stempel”. Da ich die Logins eh loggen will, könnte man ja da ja vielleicht aus ner log id und nem weiteren wert was zusammenschustern.

und die abfrage in etwa so oder?

if(Session & IP korrekt vollständig)
{
eingeloggt
} elseif(cookie gesetzt und wert korrekt) {
eingeloggt -IP aktualiersieren}
else {
falsch - cookie und session zerstören
}

ich nutz sowas ähnliches bei nem neuen sich noch in der entwicklung befindlichen projekt:

[code] $session_ok = $row3->Session;
}

if($session_ok == $session_id)
     	{
         $change = "UPDATE login Set
         Datum = '$datum'
         WHERE Session = '$session_id'";
         $update = mysql_query($change);
     }else{[/code]

Das script speichert beim login datum, zeit, ip, sowie die derzeitig session_id
der teil fragt es ab und wenn die abfrage erfolgreich war, gibt das script den zugang frei

[quote=“Mr.Generation”]Das script speichert beim login datum, zeit, ip, sowie die derzeitig session_id
der teil fragt es ab und wenn die abfrage erfolgreich war, gibt das script den zugang frei[/quote]
Was fragt dein Script ab - das Datum?

Hoffentlich nicht wirklich (nur) das Datum.
Denn wenn ein Script meint, mich kurz nach Mitternacht als nicht eingeloggt betrachten zu dürfen, nur weil ich mich kurz vor eingeloggt habe, dann taugt es nichts.

Und was ihr immer alle mit der IP habt, verstehe ich wirklich nicht …

@Mr.Generation und wenn du mir jetzt nen Link mit example.com.?site=Regisiterungen&section=neu&mode=admin&PHPSESSID=9970ac048cb8b015b5969f1a75e1c4f

sendest bin ich dann eingeloggt

@chrisb: IP als zusätzliche sicherheit gegen sessionklau

@kalkal: mein script list die session_id des browsers intern aus.
der link enthält keinerlei sessionIDs oder ähnliches ^^

[quote=“Mr.Generation”]@kalkal: mein script list die session_id des browsers intern aus.
der link enthält keinerlei sessionIDs oder ähnliches ^^[/quote]

erklär das mal genauer wie du das anstellst

wenn php man cookies nicht zulässt hängt php automatisch die SID an meines Wissens

[code]<?php
ob_start();
session_start();
$session_id = session_id();
error_reporting(E_ALL);
header(“Content-Type: text/html; charset=ISO-8859-1”);
ob_end_flush();
?>

MrG-Server-x2: Blog - Coming soon...

(…)[/code]

ich eröffne zuerst im header eine session und speichere die session_id in einer variable zwischen. die headerdatei wird dann von der entsprechenden unterseite includiert und eingelesen. die session_id des browsers ändert sich für den aufenthalt nicht (bei meinem firefox geht das wohl auch über mehrere tage) und bleibt somit gleich. die session_id wird bei jeder neuen unterseite neu eingelesen bzw ausgelesen und verwendet. das bedeutet das ich nicht darauf angewiesen bin, die session id von einer seite zur anderen zu senden oder mit “GET” zu holen :slight_smile:

php-einfach.de/php-tutorial/php-sessions.php
hab den großteil hiervon und noch nen wenig google

Richtig,

und der Browser speichert sie als Cookie sofern sie aktiv sind.

Geh jetzt einfach mal auf deine Seite und deaktivier die Cookies, und dann schnau mal was mit den Links gemacht wird. Und jetzt brauchste nichtmal nen DAU haben, sondern nur jemand der technisch nicht sonderlich genau auskennt, und der fragt z.B ob der Artikel eines onlineshops was taugt und postet dabei den Link…

Ja - weil sie in einem Cookie gespeichert ist, und der Browser dessen Inhalt bei jedem Request wieder mitschickt.

Ach, und woher wird die eingelesen?

Sessions basieren darauf, dass der Browser bei jedem Request die Session-ID erneut mitschickt - sonst wüsste dein Script nichts von ihr, könnte also den Client nicht identifizieren.

Und dieses Mitschicken funktioniert entweder per Cookie - oder, wenn das nicht geht, als Fallback per GET oder POST.


Nein, wird nicht im URL angezeigt

edit: es wird kein post oder get befehl gesendet.
das script bekommt die id und speichert diese, um mit ihr zu arbeiten.

selbst wenn ich die cookies deaktiviere, wird oben in der adresszeile keine ID angezeigt

Dann wird die Session-ID also wohl per Cookie übermittelt - gut, dass ist der Normalfall.

Es wird selbstverständlich ein Request gesendet, wenn dein Browser eine neue Seite anfordert, oder ein Formular abschickt.
Ob dabei di Session-ID auf einem anderen Weg als per Cookie mitgesendet wird, hängt von den Umständen ab.

Dann „funktioniert“ aber auch deine Session nicht mehr - wenn die ID dann nicht auf anderem Wege übermittelt wird.

Das ist schön für das Script.
Aber wenn ein neuer Request reinkommt, bedeutet das auch eine neue Scriptinstanz. Und die muss die Session-ID übergeben bekommen - sonst wird eine neue Session erzeugt, und mit der bist du dann nicht mehr „eingeloggt“ oder wasauchimmer.

@mrgeneration: dann hast du wohl keine session derzeit gestartet, oder der es wird als post gesendet. dekativier doch hier mal im Forum mal cookies…

@chrisb: was meinst du zu meinem bisherigen Ansatz?

die session bleibt lustiger weise erhalten o_O

sobald sich deine session aber änder, bist du automatisch “ausgeloggt”

ich denke nur das das jetz nichmehr wirklich was in deinem thread zu suchen hat, weil das eher in ner art kleinen zank ausartet ^^"

via pm gern

edit: ich will meine cookies nich im firefox deaktivieren, sry

Quatsch.

Das ist kein Zank - wir versuchen dir nur verständlich zu machen, dass du die Funktionweise von Sessions bisher ganz offensichtlich noch nicht vollständig verstanden hast.

Das ist möglich, nur wundert es mich das wenn ich im IE mit deaktivierten Cookies mich einloggen kann, auf die nächste Seite gehen kann, dort fleißig F5 Spam veranstalten kann und alle Funktionen nutzen kann, ohne das ich rausflieg.

D.h. irgendwas in meinem Script sorgt dafür, dass meine “Session” (die scheinbar keine ist) aufrecht erhalten wird, selbst ohne Cookies. Wie auch immer das funktioniert ^^

Per Übergabe der Session-ID entweder per GET oder POST.

Wenn ich deine Seite http://www.mrgeneration.de/forum/ aufrufe, dann in meinem Browser Cookies deaktivere, und auf “Login” klicke - dann gelange ich auf die Seite
http://www.mrgeneration.de/forum/ucp.php?mode=login&sid=e09bd512631c303c13f58fd5b132a426

Das ist absolut das Verhalten, was zu erwarten ist - PHP fügt die Session-ID automatisch an die Adresse an, weil es so konfiguriert ist.

Und auf jeder anderen Seite, die Sessions, so wie sie in PHP eingebaut sind, nutzt, ist das auch nicht anders. Es sei denn natürlich, es wäre entsprechend konfiguriert, dass dieser Fallback nicht genutzt werden soll - dann „funktionieren“ auf diesen Seiten aber auch keine Sessions.