PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 PHP-Login-Systeme: Welches ist besser? + Frage zu Sessions


dav133
2007-08-14, 16:24:29
ntag,

Hab hier 2 PHP-Sessionbasierte Loginsysteme. Würde gerne wissen, welches eher zu empfehlen ist, obwohl beider von der grundlegenden Funktionsweise sehr ähnlich sind. Beim einen wird in der Datenbank die Session gespeichert und bei jedem neuen Seiten aufruf mit der aktuellen Session verglichen. Dies sollte m.E. nach eine höhere Datenbanklast als konventionelles Session-Checking haben.

Genug der Vorrede, hier die relevanten Code-Abschnitte zum Checken der Session:

Methode 1:

<?php
session_start ();
if (!isset ($_SESSION["user_id"]))
{
header ("Location: formular.php");
}
?>

-> Diese Datei wird in jede andere Datei, die geschützt werden soll, eingebunden




Methode 2:


function check_user ( $name, $pass ) {
// magic quotes anpassen
if ( get_magic_quotes_gpc() ) {
$name = stripslashes($name);
$pass = stripslashes($pass);
}
// escapen von \x00, \n, \r, \, ', " und \x1a
$name = mysql_real_escape_string($name);
// escapen von % und _
$name = str_replace('%', '\%', $name);
$name = str_replace('_', '\_', $name);

$sql = 'SELECT UserId FROM users WHERE UserName = \'' . $name . '\' AND UserPass=\'' . md5($pass) . '\'';
if ( !$result = mysql_query($sql) ) {
exit(mysql_error());
}
if ( mysql_num_rows($result) == 1 ) {
$user = mysql_fetch_assoc($result);
return ( $user['UserId'] );
} else {
return ( false );
}
}


function login ( $userid ) {
$sql = 'UPDATE users SET UserSession = \'' . session_id() . '\' WHERE UserId = ' . ((int)$userid);
if ( !mysql_query($sql) ) {
exit(mysql_error());
}
}


function logged_in () {
$sql = 'SELECT UserId FROM users WHERE UserSession = \'' . session_id() . '\'';
if ( !$result = mysql_query($sql) ) {
exit(mysql_error());
}
return (mysql_num_rows($result) == 1);
}


Von der Menge des Codes her ein beträchtlicher Unterschied, also zur zweiten Frage: Was hat es für Vorteile, wenn ich die Session-ID in die Datenbank speichere und permanent vergleiche? Ist das sicherer?

lg

MadMan2k
2007-08-14, 20:44:10
woher kommen name und pass bei der zweiten variante?

dav133
2007-08-14, 21:33:18
woher kommen name und pass bei der zweiten variante?

login.php

<?php

session_start();
include_once('sessionhelpers.inc.php');

if ( isset($_POST['login']) ) {
$userid = check_user($_POST['username'], $_POST['userpass']);
if ( $userid ) {
login($userid);
} else {
echo '<p>Ihre Anmeldedaten waren nicht korrekt!</p>';
}
}

if ( !logged_in() ) {
echo <<<END
<form method="post" action="login.php">
<label>Benutzername:</label> <input name="username" type="text"><br />
<label>Passwort:</label> <input name="userpass" type="password" id="userpass"><br />
<input name="login" type="submit" id="login" value="Einloggen">
</form>
END;
} else {
echo '<p><a href="soll-geschuetzt-werden.php">Testseite</a></p>';
echo '<p><a href="logout.php">Ausloggen</a></p>';
}

?>

MadMan2k
2007-08-16, 22:29:01
logged_in() dürfte nicht wie gewünscht funktioneiren, da session_id() ne andere session_id zurückgibt wenn vor session_start() keine alte verfügbar war...