Session-Script, Meinungen



  • Hi Leute,
    ich hätte gerne mal ein paar Meinungen, Anregungen, Vorschläge etc. zu meinem Login-Scipt.

    // Das ist erst mal das eigentliche Login

    @session_start();	//Session wird gestartet
    
    	if (empty($_SESSION['userName']) and empty($_SESSION['userPass']))	/* Wenn 1. noch keine (weil noch nicht eingelogggt) 
    									oder 2. keine (weil falsch eingeloggt) Informationen über 
    									den User vorliegen wird er als gast eingeloggt. */
    	{
    		$_SESSION['userName']='gast';
    		$_SESSION['userPass']='gast';
    		$page_m="start.php";
    	}
    
    	if (isset($_login) and isset($_pass))  	// Die Anmeldedaten, die in das Logon-Form eingegeben wurden, werden in die Session gepackt.
    	{
    		$_SESSION['userName']=$_login;
    		$_SESSION['userPass']=$_pass;
    		$page_m="start.php";	// Content-Seite, für Logon egal
    	}
    
    	include("connect.php4");	// Einbinden der Datenbankverbindung
    
    	$logok = FALSE;	// Standardmäßig ist man nicht eingelogt
    
    	if (isset($_SESSION['userName']) and isset($_SESSION['userPass']))	// Wenn Anmeldedaten ins logon-form eingegeben wurden
    	{
    		// 1. Auslesen der Datenbank:
    		$query="SELECT id, user, password, permission FROM user";	// Alle Einträge der DB werden ausgelesen
    		$result=mysql_query($query,$db);
    
    		// 2. Ausgabe:
    		while($data=mysql_fetch_array($result))
    		{
    			if (($data['user']==$_SESSION['userName']) and ($data['password']==$_SESSION['userPass']))	// Wenn die Anmeldedaten korrekt waren
    			{
    				$_SESSION['userPermission']=$data['permission']; //Dem User wird die, in der DB für ihn eingetragene, Berechtigung zugewiesen
    				$logok = TRUE;	// Logon-Variable wird auf true gesetzt
    
    				// Jetzt wird das aktuelle Datum in die DB geschrieben
    				$datum = date('Y-m-d');
    				$query2="UPDATE user SET last_logon = $datum";	
    
    			} /* end if */
    		} /* end while */
    
    	} /* end if */
    
    // --------------------------------------------------------------------------------------------------
    

    // Jetzt kommt die Überprüfung, ob man sich auch richtig angemeldet hat!

    if ($logok==FALSE)
    	{
    		echo'	Leider sind Ihre Anmeldeinformationen nicht korrekt!<br>
    			Klicken Sie auf zurück und versuchen sie es noch einmal!
    			<br><br>
    			<a href=index.php>Zurück</a>';
    	}
    	else
    	{
    
    		// Damit man auch weiß, als was man angemeldet ist:
    		echo ("angemeldet als: <b>$_SESSION[userName]</b>, Berechtigung: <b>$_SESSION[userPermission]</b>&nbsp;");
    
    		// Content-Seite wird included (das von oben mit page_m)
    
    		// Links werden so gemacht:
    		// echo '<a href="index.php?page_m=div/rechtliches.html&' . SID . '" target=_top>Rechtliche Hinweise</a> ';
    	}
    
    // --------------------------------------------------------------------------------------------------
    

    // Den content auf den Seiten lasse ich dann so anzeigen:

    if ($_SESSION['userPermission']=="admin")
    {
    	echo 'Hey, du darfst alles sehen! ;-)';
    }
    else if ($_SESSION['userPermission']=="user")
    {
    	echo 'Du darfst manches sehen :-)';
    }
    else if ($_SESSION['userPermission']=="gast")
    {
    	echo 'Wenn du was sehen willst, melde dich an!!';
    }
    else
    {
    	echo 'Wie auch immer du es geschafft hast, bis hierher zu kommen, du darfst gaaaar nichts sehen!';
    }
    
    // --------------------------------------------------------------------------------------------------
    

    // Und wenn sich der Freundliche Benutzer dann wieder verabschieden will funktioniert das so:

    session_unset();
    	$_SESSION=array();
    
    	echo 'Abmeldung erfolgreich!';
    
    // --------------------------------------------------------------------------------------------------
    

    Jetzt noch ein paar Fragen:

    Logout:
    - Ist das ok so, oder würdet ihrs anders machen? Ich hab auch was von @session_destroy(); gelesen.?
    - Wenn der User sich nicht abmeldet kann man doch irgendwie sonen Timeout einstellen nachdem dann die Session automatisch verfällt. Wie geht das?

    Session-ID:
    - Ist es in Ordnung, dass die Session-ID per URL übergeben wird, oder ist das ein Risiko?

    THX, mfg
    dope_dope



  • MySQl ist eine Datenbank und kein Datenhaltung.
    Was ist wenn du > 2 Datensätze drin hast. Gehst du dann auch alle durch nur um einen zu finden.

    Frage die Datenbank nach einen Eintrag mit USERNAME und PASSWORD. Die DB macht genau wofür sie da ist. Sie gibt dir einen Datensatz zurück oder nicht. Wenn nicht dann hat der User falsche Daten. Hier musst du aber noch auf SQL-INjections achten.



  • So besser???

    if (isset($_SESSION['userName']) and isset($_SESSION['userPass']))	// Wenn Anmeldedaten ins logon-form eingegeben wurden
    	{
    		// 1. Auslesen der Datenbank:
    		$query="SELECT id, user, password, permission FROM user WHERE user='$_SESSION[userName]' && password='$_SESSION[userPass]'";	
    		$result=mysql_query($query,$db);
    
    		// 2. Ausgabe:
    		while($data=mysql_fetch_array($result))
    		{
    			$_SESSION['userPermission']=$data['permission']; //Dem User wird die, in der DB für ihn eingetragene, Berechtigung zugewiesen
    			$logok = TRUE;	// Logon-Variable wird auf true gesetzt
    
    			// Jetzt wird das aktuelle Datum in die DB geschrieben
    			$datum = date('Y-m-d H:i:s');
    			$query2="UPDATE user SET last_logon='$datum' WHERE user='$_SESSION[userName]'";
    
    			$result2=mysql_query($query2,$db);
    			if ($result2>0)
    			{
    				$Text = "Datum aktualisiert!";
    			}
    			else
    			{
    				$error= mysql_error($link); echo "<br>Datum konnte nicht aktualisiert werden! $error";
    			die();	
    			}
    		} /* end while */
    	} /* end if */
    


  • DU solltest eigentlich nur einen User bekommen sonst hast du ein Problem. Deshalb keine Schleife.
    Das Passwort sollte auf Space gecheckt werden sonst ist ein 1 OR 1 = 0 möglich.



  • Also so?

    if (isset($_SESSION['userName']) and isset($_SESSION['userPass']))	// Wenn Anmeldedaten ins logon-form eingegeben wurden
    	{
    		// 1. Auslesen der Datenbank:
    		$query="SELECT id, user, password, permission, last_logon FROM user WHERE user='$_SESSION[userName]' && password='$_SESSION[userPass]'";
    		$result=mysql_query($query,$db);
    
    		// 2. Ausgabe:
    		$data=mysql_fetch_array($result);
    
    		$_SESSION['userPermission']=$data['permission']; //Dem User wird die, in der DB für ihn eingetragene, Berechtigung zugewiesen
    		$logok = TRUE;	// Logon-Variable wird auf true gesetzt
    
    		// Jetzt wird das aktuelle Datum in die DB geschrieben
    		$datum = date('Y-m-d H:i:s');
    		$query2="UPDATE user SET last_logon='$datum' WHERE user='$_SESSION[userName]' && password='$_SESSION[userPass]'";
    
    		$result2=mysql_query($query2,$db);
    		if ($result2>0)
    		{	$Text = "Datum aktualisiert!";	}
    		else
    		{	$error= mysql_error($link); echo "<br>Datum konnte nicht aktualisiert werden! $error";
    			die();	
    		}
    	} /* end if */
    

    Und was meinst du damit? Kannst du es etwas genauer erklären????

    Unix-Tom schrieb:

    Das Passwort sollte auf Space gecheckt werden sonst ist ein 1 OR 1 = 0 möglich.



  • du kannst keine berchtigung zuweisen wenn du nicht weißt ob ein Datensatz vorhanden ist. Also musst du überprüfen ob eine Ergebnismenge vorliegt.



  • Na das hatte ich doch vorher mit dem while, da wurde sie nur zugewiesen, wenn eine ergebnissmenge vorliegt. Und da sowieso nie mehr als eine Ergebnissmenge vorliegen wird mache ich es dann auch besser wieder so, oder?

    Oder meinst du so in der Art?

    if ($result>0) 
            {    $Text = "Da ist deine Ergebnismenge";    } 
            else 
            {    $error= mysql_error($link); echo "<br>keine Ergebnismenge $error"; 
                die();    
            }
    


  • Ich mache das immer so

    $ID = $_POST["ID"];
    $PW = $_POST["PW"];
    
    if (isset($ID) && isset($PW))
    {
    	$PW = str_replace(' ','',$PW);
    	if (empty($ID) || !is_numeric($ID) )
    	{
    		$alert = "Bitte geben Sie Ihre Kennung ein!";
    	} elseif (empty($PW))
    	{
    		$alert = "Bitte geben Sie Ihr Passwort ein!";
    	}
    	else
    	{
    		$db = new sql_db($dbhost, $dbuser, $dbpasswd, $dbname);
    		if (!$db->db_connect_id)
    		{
    			$alert = "Fehler: Keine Verbindung zur DB hergestellt!\n Versuchen sie es bitte nochmals !";
    		}
    		else
    		{
    			if(!($result = $db->sql_query("SELECT id FROM userdaten WHERE id=$ID AND passwort='$PW' LIMIT 1")))
    			{
    				$errorm = $db->sql_error();
    				echo $errorm['message'];
    
    //				$alert = "Fehler: SQL-Anfrage nicht korrekt!";
    			}
    			else
    			{
    				if ($db->sql_numrows($result) == 0)
    				{
    					$alert = "Bitte geben Sie eine gültige Kennung oder Passwort ein!";
    				}
    				else 
    				{
    					if (!($row = $db->sql_fetchrow($result)))
    					{
    						$alert = "Fehler: SQL-Ergebnis nicht korrekt!";
    					}
    					else
    					{	
    						$kdnrId = $ID;
    						session_start();
    						$_SESSION['kdnrId'] = $kdnrId;
    						header("Location: frame.php?".SID);
    					}
    				}
    			}
    		}
    	}
    
    }
    


  • Ich habs jetzt so gemacht:

    if ( mysql_affected_Rows() > 0)	// Wenn Anmeldeinformationen korrekt sind
    		{	
    			// Jetzt wird man angemeldet			
    			$data=mysql_fetch_array($result);
    			$_SESSION['userPermission']=$data['permission'];	// Dem User wird die, in der DB für ihn eingetragene, Berechtigung zugewiesen
    			$logok = TRUE;	// Logon-Variable wird auf true gesetzt
    
    			// Jetzt wird das aktuelle Datum als last_logon in die DB geschrieben
    			$datum = date('Y-m-d H:i:s');
    			$query2="UPDATE user SET last_logon='$datum' WHERE user='$_SESSION[userName]' && password='$_SESSION[userPass]'";
    			$result2=mysql_query($query2,$db);
    			if ($result2>0)
    			{	
    				// Datum aktualisiert	
    			}
    			else
    			{
    				// Datum konnte nicht akutlisiert werden	
    			}
    		}
    		else
    		{
    			// Anmeldeinformationen nicht korrekt
    		}
    

    Erklär mir mal bitte nochmal das mit dem Passwort und dem Space und so.



  • Du überprüfst ob die ANfrage erfolgreich war und nicht ob eine Ergebnismenge geliefert wurde. Die Anfrage war ja erfolgreich deshalb liefert die mysql_query true zurück.

    if ($result>0) // Wenn Anmeldeinformationen korrekt sind
    {

    Das die Anfrage erfolgreich ist heißt aber nicht das ein Datensatz zurückgekommen ist.

    num_rows=mysql_numrows(num\_rows = mysql\_num_rows(result);

    if ($num_rows >= 1)
    {
    // USER gefunden mache was mit ihm
    }
    else
    {
    USERNAME oder PASSWORT sind nicht korrekt
    }

    http://www.php.net/manual/de/function.mysql-num-rows.php



  • Ich hab es doch jetzt so gemacht (s.o.), ist das nicht ok???

    if ( mysql_affected_Rows() > 0)    // Wenn Anmeldeinformationen korrekt sind
    


  • ich würde sogar noch unterscheiden zwischen ==1 und >1!

    Bei >1 liegt ein gravierender Fehler vor, den ich zumindest irgendwo vermerken würde (log,mail an admin). Bestünde doch Handlungsbedarf beim Anlegen der Accounts (Duplikatprüfung fehlte oder versagte)!



  • Ja ok, also habs jetzt so gemacht wie in deinem Beispiel, was ich mache wenns doppelt ist, weiß ich noch nicht, eigentlich sollte das ja nicht passieren.

    Und was meintest du mit dem Passwort?



  • mysql_affected_Rows ist falsch

    Schaue dir bitte die API an.

    mysql_affected_Rows bezieht sich nicht auf die Ergebnismenge.
    Eine Ergebnismenge gibt nicht bei INSERT,UPDATE,DELETE.
    Deshalb überprüft man die Anzahl betroffener Datensätze mit mysql_affected_Rows.

    Obn eine Ergebnismenge vorliegt bekommt man so: mysql_num_rows



  • Doppelt darf ein Datensatz sein solange USERNAME und PASSWORT unterschiedlich sind.

    Sollte aber nicht passieren weil eine USERNAME ja eindeutig ist.

    Wenn es 2 gleiche USERNAMEN gibt und beide verwenden das gleiche Passwort ist es ein Problem.
    Man übergibt ja die USERID weiter um damit was zu machen.



  • Es gibt keine doppelten User.
    Es gibt aber doppelte Passwörter.

    Ich meinte das hier:

    Das Passwort sollte auf Space gecheckt werden sonst ist ein 1 OR 1 = 0 möglich.

    Und was sagst du zur Übergabe der SessinID per URL?



  • Ändere mal deinen Code so wie ich es gesagt haben.
    Statt mysql_affected_Rows mysql_num_rows

    Dann geht es auch.

    Bezgl. SQL-Injektions guckst du bitte im INET.



  • Hab den Code jetzt so geändert:

    $num_rows = mysql_num_rows($result); 
    		if ($num_rows >= 1)	// Wenn Anmeldeinformationen korrekt sind		{	
    			// Jetzt wird man angemeldet			
    			$data=mysql_fetch_array($result);
    			$_SESSION['userPermission']=$data['permission'];	// Dem User wird die, in der DB für ihn eingetragene, Berechtigung zugewiesen
    			$logok = TRUE;	// Logon-Variable wird auf true gesetzt
    usw. ...
    

    Danke für deine Hilfe!


Anmelden zum Antworten