Unique86 Geschrieben 21. Juli 2006 Teilen Geschrieben 21. Juli 2006 Hallo, eure Meinung ist mir wichtig ... Folgendes ... ich habe einen Login geschrieben auf Basis von PHP und MySQL. Meine Frage an euch, meint Ihr der Source ist so sicher genug oder müssten noch hier und da Eckpunkte verändert werden? Hier der Source ... inc.php <?php @session_start(); @mysql_connect("HOST","USER","PASS"); @mysql_select_db("DB"); function check_string($string) { // erlaubte zeichen a-z,A-Z,0-9,-,_ if((preg_match('/^[a-zA-Z0-9\-\_]+$/',$string))) return true; return false; } function login($benutzername,$kennwort,$modus=1,$cookie_gelesen=1) { // ############# Konfiguration start ############# // ### Cookies ### // Name des Cookies $conf['cookie_name'] = "login_cookie"; // Ablaufzeit des Cookies (1 Monat) $conf['cookie_zeit'] = time()+3600*24*7*4; // Inhalt des Cookies (Wird im spaeterem Verlauf festgelegt) $conf['cookie_inhalt'] = ""; // ### Sonstiges ### // Modus ( 1 = Session und Cookie setzen / 2 = Session ohne Cookie setzen ) $conf['modus'] = $modus; // CookieSet ( 1 = Benutzername und Kennwort sind nicht aus einem Cookie entnommen / <1 = Benutzername und Kennwort sind einem Cookie entnommen somit ist das Kennwort schon verschluesselt ) $conf['cookie_gelesen'] = $cookie_gelesen; // ### Variablen ### // Benutzername $vars['benutzername'] = htmlspecialchars(trim($benutzername)); // Kennwort $vars['kennwort'] = htmlspecialchars(trim($kennwort)); // ############# Konfiguration ende ############# // Ist der Benutzername oder das Kennwort "leer" oder sind ungueltige Zeichen im String dann gib ein false wert zurueck if(strlen($vars['benutzername']) == 0 OR strlen($vars['kennwort']) == 0 OR !check_string($vars['benutzername']) OR !check_string($vars['kennwort'])) { return false; }else { // Ist das Kennwort NICHT aus einem Cookie dann muss es mit md5 verschluesselt bzw. verhasht werden if($conf['cookie_gelesen'] == 1) { $vars['kennwort'] = md5($vars['kennwort']); } // SQL Abfrage ob benutzername und kennwort gleich den in der Datenbank sind $sql = @mysql_query("SELECT benutzer_id FROM tbl_benutzer WHERE benutzername = '".$vars['benutzername']."' AND kennwort = '".$vars['kennwort']."' "); // Ist die Abfrage erfolgreich dann check den Modus if(@mysql_num_rows($sql) == 1) { if($conf['modus'] == 1) { // Cookie Inhalt wird aus benutzername@kennwort zusammengebaut $conf['cookie_inhalt'] = $vars['benutzername']."@".$vars['kennwort']; // Cookie wird gesetzt @setcookie($conf['cookie_name'],$conf['cookie_inhalt'],$conf['cookie_zeit']); // Session für den login wird gesetzt $_SESSION['success'] = true; return true; }else { // Session für den login wird gesetzt $_SESSION['success'] = true; return true; } }else { // SQL Abfrage hat nicht geklappt return false; } } } [/php] [b]index.php[/b] [php] <?php // Pruefen ob der Browser Cookies akzeptiert if(isset($_COOKIE['browser_check'])) { $browser_check = true; }elseif($_GET['check'] != 1) { @setcookie("browser_check","set",time()+3600); header("Location: index.php?check=1"); } include("inc.php"); // Wenn $_GET['logout'] gesetzt ist dann loesche $_SESSION['success'] if(isset($_GET['logout'])) { // Wenn $_COOKIE['login_cookie'] gesetzt ist dann loesche Cookie if(isset($_COOKIE['login_cookie'])) @setcookie("login_cookie",0,time()-3600); // Loesche SESSION['success'] unset($_SESSION['success']); //Leite weiter zur index.php header("Location: index.php"); } // Wenn $_COOKIE['login_cookie'] gesetzt ist dann ueberpruefe den Inhalt und fuehre ggf. den auto login aus if(isset($_COOKIE['login_cookie']) AND !isset($_POST['sender']) AND !isset($_GET['logout'])) { // Hole den Inhalt aus dem Cookie $cookie_inhalt = $_COOKIE['login_cookie']; // Trenne benutzername und kennwort anhand des Trennzeichens @ $cookie_inhalt = explode("@",$cookie_inhalt); // Gehe mit Cookiedaten in die login funktion login($cookie_inhalt[0],$cookie_inhalt[1],1,2); } // Wenn Sumbit gepostet wurde if(isset($_POST['sender'])) { // Wenn Cookie setzen "aktiv" if($_POST['co'] == 'on') { if(login($_POST['username'],$_POST['password']) == false) { echo "Sry da hat was nicht geklappt"; } }else { if(login($_POST['username'],$_POST['password'],2,1) == false) { echo "Sry da hat was nicht geklappt"; } } } ?> <html> <head> <title>test</title> </head> <body bgcolor="#FFFFFF" topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0" > <?php if(isset($_SESSION['success'])) { echo "drin<br><a href='index.php?logout=true'>Logout</a>"; }else { ?> <form target="_self" method="post" name="main"> <?php if(!isset($browser_check)) echo "Ihr Browser akzeptiert keine Cookies, daher wird dieses Feld deaktiviert<br><br>"; ?> User : <input type="text" name="username"><br> Pass : <input type="text" name="password"><br> Cookie (ja/nein) : <input type="checkbox" name="co" <?php if(!isset($browser_check)) echo "disabled";?>><br> <input type="submit" name="sender"> </form> <?php } ?> </body> </html> Ich danke schon einmal für replys Gruss Sven Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etreu Geschrieben 21. Juli 2006 Teilen Geschrieben 21. Juli 2006 <?php // ... // CookieSet ( 1 = Benutzername und Kennwort sind nicht aus einem Cookie entnommen / <1 = Benutzername und Kennwort sind einem Cookie entnommen somit ist das Kennwort schon verschluesselt ) $conf['cookie_gelesen'] = $cookie_gelesen; [/php] Du speicherst nicht wirklich ein Kennwort in einem Cookie, oder? Egal ob verschlüsselt oder nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Unique86 Geschrieben 21. Juli 2006 Autor Teilen Geschrieben 21. Juli 2006 doch mache ich, erkläre mir, wie ich bitte sonst mit einem cookie und einer automatischen anmeldung arbeiten soll ! ohne pwd kommste ja wohl schlecht in ein system rein ... gruss sven ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 21. Juli 2006 Teilen Geschrieben 21. Juli 2006 sessionvariablen gehen nicht ? was machste wenn ein user cookies ausgeschaltet hat ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Unique86 Geschrieben 21. Juli 2006 Autor Teilen Geschrieben 21. Juli 2006 sessionvariablen gehen nicht ? was machste wenn ein user cookies ausgeschaltet hat ? Sag mal, hast du dir überhaupt nur ansatzweise den Source angeguckt ? Wenn ja dann frage ich mich, was deine Fragestellung soll ... Wenn der User Cookies deaktiviert hat, bekommt er gar nicht die möglichkeit das häkchen bei "cookies setzen" zu machen denn "disabled". <?php // Pruefen ob der Browser Cookies akzeptiert if(isset($_COOKIE['browser_check'])) { $browser_check = true; }elseif($_GET['check'] != 1) { @setcookie("browser_check","set",time()+3600); header("Location: index.php?check=1"); } ?> <form target="_self" method="post" name="main"> <?php if(!isset($browser_check)) echo "Ihr Browser akzeptiert keine Cookies, daher wird dieses Feld deaktiviert<br><br>"; ?> User : <input type="text" name="username"><br> Pass : <input type="text" name="password"><br> Cookie (ja/nein) : <input type="checkbox" name="co" <?php if(!isset($browser_check)) echo "disabled";?>><br> <input type="submit" name="sender"> </form> [/PHP] Natürlich arbeite ich mit Sessions ... stell dir vor, sogar wenn der User ein Cookie setzt wird der login via Session gemacht denn, der Cookie übernimmt nur EINMAL das einloggen (was ja auch sinn und zweck der sache ist) so far ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 22. Juli 2006 Teilen Geschrieben 22. Juli 2006 eure Meinung ist mir wichtig ... Das freut mich aber PW speichern irgendwo is immer schlecht, weil das kann einfach geklaut werden und damit hat derjenige der es hat dann immer Zugriff... einen Cookie "fälschen" ist ja noch viel einfacher als das PW aus dem Cookie zu klauen. Ich hab das bei mir so gemacht, dass ich über die Option "Angemeldet bleiben" einen Cookie setze, der aber nciht das PW enthälz sondern einen zufälligen MD5-Hash. Dieser Hash ist in einer extra Tabelle zusammen mit der User-Id gespeichert. Außerdem einem Ablaufdatum (1 Woche). Wenn beim Betreten der Seite keine Session aktiv ist oder der Besucher nicht angemeldet wird dieser Hash in der Tabelle gesucht und das Ablaufdatum geprüft. Wenn alles passt, ist der Benutzer der Benutzer, mit der dortigen ID. Natürlich ist das auch nicht 100% sicher, aber darüber muss der Benutzer sich eben im klaren sein. Besser als das PW in einem Cookie zu speichern ist es aber IMHO allemal. Ach ja, das Ablaufdatum wird bei jedem Login neu gesetzt, und wenn der Benutzer Abmelden klickt, wird der Cookie (oder nur der Eintrag in der Tabelle?) gelöscht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Unique86 Geschrieben 22. Juli 2006 Autor Teilen Geschrieben 22. Juli 2006 Hi, welcher Eintrag in der Tabelle ??? Der cookie wird dann einfach nur gelöscht ... mehr nicht ... Ich speicher ja nichts in einer Tabelle Gruss Sven ... P.S. THX für den Tip mit dem hash, werd es mal versuchen einzubauen ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 22. Juli 2006 Teilen Geschrieben 22. Juli 2006 welcher Eintrag in der Tabelle ??? Die Tabelle, die den Hash einem User zuordnet. Und ich hab auch nie gesagt, dass du die schon hast Natürlich reicht es einfach, den Cookie zu löschen... im Idealfall. Wenn der Cookie aber kompromitiert worden ist, dann nicht mehr. Außerdem läuft bei mir bei jeder Anfrage nach der Hash-UserID Zuordnung eine Funktion, die alte Einträge löscht. Es ist damit also theoretisch schon möglich, den Hash zu stehlen und sich als User einzuloggen. Sobald der User sich aber abmeldet oder die Woche (in dem Fall) rum ist, braucht man wieder das Passwort, welches nur der User hat. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.