Simples Login - Session_Register

Webflasher

Mitglied
Hallo zusammen,

ich habe ein (wie ich finde) sehr gutes Tutorial zum Thema Login in PHP gefunden. Beim durcharbeiten, ist mir dann aufgefallen, dass das Tutorial mit einer veralteten Methode zur Session Registrierung arbeitet und daher nicht mehr unterstützt wird.
Ich habe bereits gegooglet und noch nicht herausgefunden, wie ich das Problem an diesem bestimmten Beispiel lösen kann (nur das es grundsätzlich über das Session Array funktionier).
Was muss ich ändern?

Danke

PHP Code der Seite, die checkt, ob die Zugangsdaten korrekt sind (Problem in den letzten Zeilen):
PHP:
$host="localhost"; // Host name 
$username="***"; // Mysql username 
$password="***"; // Mysql password 
$db_name="test"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

// username and password sent from form 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

// To protect MySQL injection
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){

// Register $myusername, $mypassword and redirect to file "login_success.php"
	session_register("myusername");
	session_register("mypassword");

	header("location:login_success.php");
}
	else {
	echo "Wrong Username or Password";
}

PHP Code aus login_sucess.php, die bei erfolgreicher Eingabe aufgerufen werden soll:

PHP:
session_start();
if(!session_is_registered(myusername)){
header("location:main_login.php");
}
 
Ich habe dir das Beispiel einfach mal umgeschrieben und mit deutschen Kommentaren versehen (zu schnelleren Erkennung ;) )
PHP:
session_start(); # Notwendig, damit mit der Session gearbeitet werden kann
$host="localhost"; // Host name 
$username="***"; // Mysql username 
$password="***"; // Mysql password 
$db_name="test"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse.
mysql_connect($host, $username, $password)or die("cannot connect"); 
mysql_select_db($db_name)or die("cannot select DB");

// username and password sent from form 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

// To protect MySQL injection
if(get_magic_quotes_gpc())	# Nur notwendig, wenn von PHP aus die POST-Daten escaped werden. Sonst verlierst du Nutzereingaben!
{
	$myusername = stripslashes($myusername);
	$mypassword = stripslashes($mypassword);
}
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){

// Register $myusername, $mypassword and redirect to file "login_success.php"
	$_SESSION['myusername'] = $myusername;
	$_SESSION['mypassword'] = $mypassword; # das sollte man eigentlich nicht machen !!

    header("location:login_success.php");
}
else {
    echo "Wrong Username or Password";
}

Bei der Überprüfung dann einfach isset($_SESSION['myusername']) nehmen.
 
Hallo Webflasher,

die Zugangsdaten (Username, Passwort) direkt in der Session abzulegen ist ziemlich fatal und stellt ein ziemliches Sicherheitsrisiko dar.

Ich würde es so lösen, dass in der Session vermerkt wird, dass der User eingeloggt ist:
PHP:
$result = mysql_query("SELECT * FROM members WHERE username = '".mysql_real_escape_string($_POST['myusername'])."' AND password = '".mysql_real_escape_string($_POST['mypassword'])."';");
if (mysql_num_rows($result) == 1)
{
	$user = mysql_fetch_object($result);
	session_start();
	$_SESSION['user'] = array(
		'isLoggedIn' => true,
		'username' => $user->username
	);
	header("location:login_success.php");
}
else
{
	echo "Wrong Username or Password";
}

Die Überprüfung ob ein User eingeloggt ist, würde dann so aussehen:
PHP:
session_start();
if ($_SESSION['user']['isLoggedIn'] !== true)
{
	header("location:main_login.php");
}

mfg aGeNET
 
Hey,

danke erstmal für die Antworten. :)

@aGeNET

Ich habe deinen Code mal eingesetzt, bekomme aber leider folgende Fehlermeldung (ich habe den Code nochmals kopiert, damit es keine Missverständnisse gibt, was wo hin muss):

eingesetzter Code in checkinglogin.php Code:

PHP:
$host="localhost"; // Host name 
$username="***"; // Mysql username 
$password="***"; // Mysql password 
$db_name="test"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

// username and password sent from form 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 


$result = mysql_query("SELECT * FROM members WHERE username = '".mysql_real_escape_string($_POST['myusername'])."' AND password = '".mysql_real_escape_string($_POST['mypassword'])."';");
if (mysql_num_rows($result) == 1)
{
    $user = mysql_fetch_object($result);
    session_start();
    $_SESSION['user'] = array(
        'isLoggedIn' => true,
        'username' => $user->username
    );
    header("location:login_success.php");
}
else
{
    echo "Wrong Username or Password";
}

Und so sieht ja dann login_sucess.phph aus:
PHP:
session_start();
if ($_SESSION['user']['isLoggedIn'] !== true)
{
    header("location:main_login.php");
}

Aber leider kommt folgende Fehlermeldung:

Code:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /Applications/XAMPP/xamppfiles/htdocs/phpt_mysqlt/login/checklogin.php:9) in /Applications/XAMPP/xamppfiles/htdocs/phpt_mysqlt/login/checklogin.php on line 53

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /Applications/XAMPP/xamppfiles/htdocs/phpt_mysqlt/login/checklogin.php:9) in /Applications/XAMPP/xamppfiles/htdocs/phpt_mysqlt/login/checklogin.php on line 53

Warning: Cannot modify header information - headers already sent by (output started at /Applications/XAMPP/xamppfiles/htdocs/phpt_mysqlt/login/checklogin.php:9) in /Applications/XAMPP/xamppfiles/htdocs/phpt_mysqlt/login/checklogin.php on line 58

@Raisch:

macht Sinn, da erkundige ich mich mal, danke :)
 
Die Fehler kommen, da vor session_start() schon eine Ausgabe stattfindet.

Es reicht übrigens schon ein einziges Leerzeichen, welches irgendwo vor dem PHP-Code steht.

Pack zur Sicherheit auch mal dieses an den Anfang deines Skriptes:
PHP:
error_reporting( E_ALL | E_STRICT );
ini_set( 'display_errors', 'On'  );
ini_set( 'log_errors', 'Off' );
Natürlich nur zu Debugzwecken, im Livebetrieb sollten Errors geloggt, aber nicht ausgegeben werden:
PHP:
error_reporting( E_ALL | E_STRICT );
ini_set( 'display_errors', 'Off'  );
ini_set( 'log_errors', 'On' );
ini_set( 'error_log', 'Pfad/zu/den/Logs/error.log' );

Beste Grüße
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück