• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Problem mit Login/Logout (Sessions)

newmacuser24

Antonowka
Registriert
27.12.05
Beiträge
355
Hallo zusammen,

Bin bei der Suche nach einem sicheren Login-Script auf folgenden Link gestossen:
http://forums.devarticles.com/progr...-creating-a-secure-php-login-script-3033.html

Bevor ich Änderungen vorgenommen habe, habe ich das Script erstmal so ausprobiert, wie es dort gepostet wurde. Funktionieren tut es einwandfrei mit einer kleinen Ausnahme:
Wenn ich mich mit Hilfe des Scripts einlogge und dann wieder auslogge kann ich mit der Browser-Taste "Zurück" wieder in den Account hinein. Logout erfüllt also nicht den Zweck, den es soll. Also hab ich mir gedacht, es würde reichen die Funktion logout() durch ein session_destroy(); zu ergänzen. Gebracht hat es leider nichts.

Gibt es vielleicht einen generellen Trick, wie man das mit der "Zurück"-Taste in den Griff bekommt?

Vielen Dank im Voraus!

Ach ja...Um ein Einlesen in das Beispielscript leichter zu machen, hier eine kleine Zusammenfassung. Die Login/Logout Prozedur besteht aus 3 Teilen: 1) member_class.php - hier sind die ganzen Funktionen zu login/logout, check, ob die session aktiv ist, etc... definiert. Mit Hilfe dieser Funktionen wird zum Beispiel eine Session ID, ein Token erstellt, bzw. die IP-Adresse des Benutzers geloggt. 2) db_connect.php - einfaches 3-Zeilen Script, dass die Verbindung zur MySQL-Datenbank herstellt. 3) whatever.php - das ist das Hauptscript, dass die verschiedenen Formulare zum Login/Logout, etc...bereitstellt.
 

Dadelu

Reinette Coulon
Registriert
06.07.05
Beiträge
939
Also prinzipiell sollte es mit einem session_destroy() funktionieren, dass du nicht einfach zurück klicken kannst.

Aber vieleicht ist irgendwo ein kleiner Codier - Fehler drinnen?

Kannst du mal den Code posten, wo du den Befehl anwendest?

Gruss
 

drok

Klarapfel
Registriert
02.06.07
Beiträge
278
Kannst du denn dann auch Sachen verändern wenn du den "Zurück"-Button betätigt hast ?
 

zeno

Lane's Prinz Albert
Registriert
05.11.05
Beiträge
4.894
gaaaaaaaanz oben rein:
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: ".gmdate ("D, d M Y H:i:s")." GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
 

newmacuser24

Antonowka
Registriert
27.12.05
Beiträge
355
Also, hier das komplette Script:

member_class.php - Definition der Funktionen:

<?php
// member class
// handlers member logon
class member_class {
var $message = '';
var $query_error = 'ERROR: something went wrong when accessing the database. Please consult your webmaster';

function member_class() { //constructor
if (!isset($_SESSION['uid'])) { //fills session with empty values
$this->set_session_defaults();
}

if ($_SESSION['logged_in']) { //already logged in
$this->check_session();
}

if (isset($_COOKIE['remember'])) {
$this->check_remembered($_COOKIE['remember']);
}
}

function register($username,$password,$remember) {
$username = mysql_escape_string($username);
$password = mysql_escape_string(md5($password));

$result=mysql_fetch_array(mysql_query("SELECT * FROM member WHERE username = '{$username}'"), MYSQL_ASSOC);
if (!$result) { //insert record if user name doesn't exist
$insert = mysql_query("INSERT INTO member VALUES ('', '$username', '$password', '', '', '')") or DIE ($this->query_error);
$result = mysql_fetch_array(mysql_query("SELECT * FROM member WHERE username = '{$username}' AND password = '{$password}'"), MYSQL_ASSOC) or DIE ($this->query_error);
$this->message .= '<p>Registration was successful</p>';
$this->set_session($result,$remember,true); //log user on
return true;
} else {
$this->message .= '<p>username already exists! Please choose a different name</p>';
return false;
}
}

function check_login($username,$password,$remember) {
$username = mysql_escape_string($username);
$password = mysql_escape_string(md5($password));

$result=mysql_fetch_array(mysql_query("SELECT * FROM member WHERE username = '{$username}' AND password = '{$password}'"), MYSQL_ASSOC);
if ($result) {
$this->set_session($result,$remember,true);

return true;
} else {
$this->failed = true;
$this->logout();
$this->message .= 'incorrect username of password. please try again';
return false;
}
}

function logout() {
// blowup cookie
setcookie('remember',time()-3600);
$this->set_session_defaults();
session_destry(); //NUR HIER HABE ICH SELBST EINGEFÜGT!
}

function set_session($result,$remember,$init = true) {
$uid=$result['uid'];
if ($init) {
$session = mysql_escape_string(session_id());
$ip = mysql_escape_string($_SERVER['REMOTE_ADDR']);
$newtoken = $this->token(); // generate a new token
$update = mysql_query("UPDATE member SET session='{$session}', token='{$newtoken}', ip='{$ip}' WHERE uid='{$uid}'") or DIE ($this->query_error);
}

$_SESSION['uid'] = $result['uid'];
$_SESSION['username'] = htmlspecialchars($result['username']);
$_SESSION['token'] = $newtoken;
$_SESSION['logged_in'] = true;

if ($remember) {
$this->update_cookie($newtoken);
}

}

function update_cookie($token) {
$cookie = serialize(array($_SESSION['username'],$token));
setcookie('remember',$cookie, time()+12099600);
}

function check_remembered($cookie) {

$serializedArray=$cookie;
$serializedArray = stripslashes($serializedArray);
list($username,$token) = unserialize($serializedArray);

if(empty($username) or empty($token)) {
return;
} else {
$username = mysql_escape_string($username);
$token = mysql_escape_string($token);
$ip = mysql_escape_string($_SERVER['REMOTE_ADDR']);
$result = mysql_fetch_array(mysql_query("SELECT * FROM member WHERE username = '{$username}' AND token ='{$token}' AND ip = '{$ip}'"), MYSQL_ASSOC) or DIE ($this->query_error);

if (!$result) {
$this->set_session($result,false,false);
}else{
$this->set_session($result,true,true);
}
}
}

function token() {
// generate a random token
for($i=1;$i<33;$i++) {
$seed .= chr(rand(0,255));
}
return md5($seed);
}

function check_session() {
$username = mysql_escape_string($_SESSION['username']);
$token = mysql_escape_string($_SESSION['token']);
$session = mysql_escape_string(session_id());
$ip = mysql_escape_string($_SERVER['REMOTE_ADDR']);
$result = mysql_fetch_array(mysql_query("SELECT * FROM member WHERE username='{$username}' AND token='{$token}' AND session='{$session}' AND ip='{$ip}'"), MYSQL_ASSOC) or DIE ($this->query_error);

if ($result != false){
}else{
$this->logout();
}
}


function set_session_defaults() {
$_SESSION['logged_in'] = false;
$_SESSION['uid'] = 0;
$_SESSION['username'] = '';
$_SESSION['cookie'] = 0;
$_SESSION['remember'] = false;
}
}

?>

whatever.php - Hauptteil:

<?php
session_start();
include 'db_connect.php';
include 'member_class.php';
$member_class = new member_class;


//$Submit=$_POST['Submit']?TRUE:FALSE;
if($_POST['Register']) { //register new user
$username = $_POST['username'];
$password = $_POST['password'];
if ($username && $password) { //check whether username and password have been submitted
if($_POST['remember'] == 1) {
$member_class->register($username, $password, true);
}else{
$member_class->register($username, $password, false);
}
}
else {
$member_class->message .= '<p>please fill in a user name and password</p>';
$_POST['form_register'] = 'true';
}
}
elseif($_POST['Login']) {
$username=$_POST['username'];
$password=$_POST['password'];
if ($username && $password) {
if($_POST['remember'] ==1) {
$member_class->check_login($username, $password, true);
}else{
$member_class->check_login($username, $password, false);
}
}
else $member_class->message .= '<p>please fill in a valid user name and password</p>';
}
elseif($_POST['Logout']) {
$member_class->logout();
}

echo $member_class->message;

if($_POST['form_register']) {
print '
<h1>Register</H1>
<form name="form1" method="post" action="">
<table border="0">
<tr>
<td width="100px;">username:</td>
<td><input type="text" name="username" value="'.$username.'"></td>
</tr>
<tr>
<td>password:</td>
<td><input type="password" name="password" value="'.$password.'"></td>
</tr>
<tr>
<td colspan="2">
<input type="hidden" name="register" value="true">
<input name="remember" type="checkbox" id="remember" value="1"> remember me for 2 weeks
</td>
</tr>
<tr>
<td colspan="2" height="20px" valign="bottom" align="right"><input type="submit" name="Register" value="Register"></td>
</tr>
</table>
</form>';

}
elseif(!$_SESSION['username']) {
print '
<h1>Login</H1>
<form name="form1" method="post" action="">
<table border="0">
<tr>
<td colspan="2" align="right"><input type="submit" name="form_register" value="register" style="border: 0px; background: transparant; text-decoration: underline; cursor: pointer;"></td>
</tr>
<tr>
<td width="100px">username:</td>
<td><input type="text" name="username" value="'.$username.'"></td>
</tr>
<tr>
<td>password</td>
<td><input type="password" name="password" value="'.$password.'"></td>
</tr>
<tr>
<td colspan="2">
<input name="remember" type="checkbox" id="remember" value="1"> remember me for 2 weeks
</td>
</tr>
<tr>
<td colspan="2" height="20px" valign="bottom" align="right"><input type="submit" name="Login" value="Login"></td>
</tr>
</table>
</form>';
}elseif($_SESSION['username']) {
echo '<p>'.$_SESSION['username'].', you\'re logged on</p>';
print '
<form name="form1" method="post" action="">
<input type="submit" name="Logout" value="Logout">
</form>';
}
?>

db_connect.php - Verbindung mit der MySQL-Datenbank:

<?php
/**
* Connect to the mysql database.
*/
$conn = mysql_connect("localhost", "username", "password") or die(mysql_error());
mysql_select_db('database', $conn) or die(mysql_error());
?>

@zeno: wo sollte ich deiner Meinung nach den von dir geposteten Code einsetzen? Habe versucht ganz oben im whatever.php - aber danach gibts kein login mehr...

@drok: schwer zu sagen...das script hat ausser login/logout noch keine funktionen...aber dennoch möchte ich nicht, dass die Taste-Zurück "funktioniert"...geht bei GMX auch nicht :)

Vielen Dank!
 

zeno

Lane's Prinz Albert
Registriert
05.11.05
Beiträge
4.894
In jede Datei die was anzeigt und durch ne Session gesichert werden soll
 

newmacuser24

Antonowka
Registriert
27.12.05
Beiträge
355
OK, erledigt...hab ich sowohl ins members_class.php, als auch ins whatever.php gepackt...leider geht "zurück-Taste" noch immer...eigenartig...

Browser-Cache hab ich entleert, bzw. neu gestartet. Verwende Safari und FireFox zum Testen...

Interessanterweise klappts jetzt im FireFox, in Safari nicht...
 
Zuletzt bearbeitet:

newmacuser24

Antonowka
Registriert
27.12.05
Beiträge
355
Interessant...scheint wie gesagt NUR Safari zu betreffen. Der Account wird durch die Taste "zurück" wieder angezeigt, trifft man aber eine Auswahl wird man sofort rausgekickt...könnte das ein bug sein? Könnte ja die Accountseite schon vertrauliche Information enthalten...Firefox verhält sich da korrekt...

Ist übrigens bei anderen Login-Seiten das gleiche...