PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei Zugriffsschutz


SuperOlli
04.01.2008, 16:01:30
Hallo liebe PHP-Gemeinde,

aus einem Buch ("PHP 5 & MySQL 4") habe ich folgende Skipte übernommen:

login.php:
<?php
session_start();
require_once('cl_db_mysql.php');
require_once('cl_db.php');
require_once('cl_zugriff.php');
$zugriff1 = new zugriff(2);
?>

logout.php:
<?php
session_start();
require_once('cl_db_mysql.php');
require_once('cl_db.php');
require_once('cl_zugriff.php');
$zugriff1 = new zugriff(3);
?>

cl_zugriff.php:
<?php
include_once('cl_db_mysql.php');
include_once('cl_db.php');
class zugriff
{
PROTECTED $idle=20;//Leerlaufzeit
PROTECTED $umleitenlogout="<a href=\"index.php\"><img src=\"pics/link.gif\" >zur LogIn-Seite</a>";//Umleitungsziel
PROTECTED $umleitenlogin="<a href=\"start.php\"><img src=\"pics/link.gif\">Weiter</a>";//Umleitungsziel
PRIVATE $modus;

function __construct($modus=1, $mindestrecht=1)
{
//modus 1 Zugriffsrecht testen
//modus 2 Login anzeigen
//modus 3 Logout anzeigen
//$mindestrecht==1 //normale Seite mit Schutz
//$mindestrecht==2 //Admin Seite
$this->modus=$modus;
if($_POST['sentzu']==2)
{
$ret = $this->logout();
$ret[1].="<br>".$this->umleitenlogout;

}
if($_POST['sentzu']==1)
{
$ret = $this->testlogin();
if($this->modus==2 AND $ret[0])
{
$ret[1].="<br>".$this->umleitenlogin;

}
}
if($this->modus==1)
{
$ret=$this->testrecht($mindestrecht);
}
if($ret[0])
{
$this->schreibrecht();
}
if(!$ret[0] OR $this->modus==2 OR $this->modus==3)
{
echo "<html><head><title>LOGIN/LOGOUT</title></head><body>";
echo "<div align=center>";
echo "<link href=version1.css rel=stylesheet media=screen>";
if($ret[1]){echo "<h2><font color=red>".$ret[1]."</font></h2>";}
}
if(!$ret[0] AND $this->modus!=3)
{
echo $this->formlogin();
}
if(!$ret[0] AND $this->modus==3)
{
echo $this->formlogout();
}
if(!$ret[0] OR $this->modus==2 OR $this->modus==3)
{
echo "</div></body></html>";
die();
}
}//ende zugriff
function testlogin()
{
$db = new db();
$result=$db->execute("SELECT passwort, userid, kennung, pruef, (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(zeit)) as time, zeit FROM user WHERE nickname='".$db->prepare($_POST['nickname'])."' ");
if($db->num_rows() != 1 )
{
$meldung="Bitte kontrollieren Sie Ihren Benutzernamen";
return array(FALSE, $meldung);
}
if(md5($_POST['passwort']) != $result[1]['passwort'])
//if($_POST['passwort'] != $result[1]['passwort'])
{
$meldung="Bitte kontrollieren Sie Ihr Passwort";
return array(FALSE, $meldung);
}
if ($result[1]['pruef']==-1)
{
$meldung="Dein Zugang ist noch nicht Freigeschaltet.<br>Bitte warte die eMail mit dem O.K. ab...";
return array(FALSE, $meldung);
}
if($result[1]['kennung']== session_id() AND $result[1]['time']/60 < $this->idle)
{
$meldung.="Sie sind bereits eingeloggt als ".$this->username();
$_SESSION['sit']=session_id();
$_SESSION['IDuser']=$result[1]['userid'];
return array(FALSE, $meldung);
}
if($result[1]['kennung'] !='' AND $result[1]['time']/60<$this->idle)
{
$meldung.="Es ist bereits jemand mit Ihrem Benutzernamen eingeloggt";
return array(FALSE, $meldung);
}
$db1= new db();
$sql="UPDATE user SET ";
$sql.=" zeit= now(), ";
$sql.=" kennung='".session_id()."' ";
$sql.=" WHERE userid='".$result[1]['userid']."' ";
$db1->execute($sql);
$_SESSION['IDuser']=$result[1]['userid'];
$_SESSION['sit']=session_id();
$meldung="Sie wurden eingeloggt als ".$_POST['nickname'];
return array(TRUE, $meldung);
}
function formlogin()
{
$aus.="<form action=\"".$_SERVER['PHP_SELF']."\" method=\"post\">";
$aus.="<input type=\"hidden\" name=\"sentzu\" value=\"1\">";
$aus.="<br><br><table border=\"0\" align=\"center\"><tr><th colspan=\"2\">LogIn</th></tr>";
$aus.="<td width=\"100\" align=\"right\">Benutzername</td>";
$aus.="<td width=\"100\"><input type=\"text\" size=\"20\" name=\"nickname\" value=\"".$_POST['nickname']."\"</td></tr>";
$aus.="<tr><td width=\"100\" align=\"right\">Passwort</td>";
$aus.="<td width=\"100\"><input type=\"password\" size=\"20\" name=\"passwort\"></td></tr>";
$aus.="<tr><td colspan=\"2\">&nbsp;</td></tr>";
$aus.="<tr><td align=\"center\" colspan=\"2\"><input type=\"submit\" value=\"LOGIN\" ></td></tr>";
$aus.="<tr><td align=\"center\" colspan=\"2\"><a href=\"user_neu.php\">Neu Registrieren</a></td></tr></table>";
$aus.="</form>";
return $aus;
}
function testrecht($mindestrecht)
{
if(!$_SESSION['IDuser'])
{
$meldung="<br>Bitte loggen Sie sich ein.";
return array(FALSE,$meldung);
}
if(!$_SESSION['sit'])
{
$meldung="<br>Bitte loggen Sie sich ein.";
return array(FALSE,$meldung);
}
$sql="SELECT admin, zeit, kennung, (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(zeit)) as time FROM user WHERE userid=".$_SESSION['IDuser']." AND kennung='".$_SESSION['sit']."'";
$db = new db();
$result=$db->execute($sql);
if($db->num_rows() != 1)
{
$meldung="<br>Sie sind nicht angemeldet, bitte loggen Sie sich ein.";
return array(FALSE,$meldung);
}
if($result[1]['time']/60>$this->idle)
{
$meldung="<br>Dein LogIn ist aufgrund zu langer Inaktivität nicht mehr gültig,<br> bitte melde Dich erneut an.";
return array(FALSE,$meldung);
}
if($result[1]['admin']==-1 AND $mindestrecht==2)
{
$meldung="<br>Sie sind nicht als Administrator angemeldet, Sie haben keine Zugriffsrechte auf diese Seite.";
return array(FALSE,$meldung);
}
return array(TRUE,"");
}
function schreibrecht()
{
if($_SESSION['IDuser'] AND $_SESSION['sit'])
{
$sql="UPDATE user SET ";
$sql.=" zeit= now() ";
$sql.=" WHERE userid='".$_SESSION['IDuser']."' AND kennung = '".$_SESSION['sit']."'";
$db = new db();
$result=$db->execute($sql);
}
}

function formlogout()
{
$aus.="<!doctype html public \"-//W3C//DTD HTML 4.0 //EN\"><html><head><link href=\"version1.css\" rel=\"stylesheet\" media=\"screen\"></head><body></body></html>";
$aus.="<br><br><h2>Sie sind angemeldet als ".$this->username()."<br>";
$aus.="Abmelden?</h2>";
$aus.="<form action=\"".$_SERVER['PHP_SELF']."\" method=\"post\">";
$aus.="<input type=\"hidden\" name=\"sentzu\" value=\"2\">";
$aus.="<br><br><input type=\"submit\" value=\"Abmelden\">";
$aus.="</form>";
return $aus;
}//Ende logoutform

function logout()
{
$sql="UPDATE user SET ";
$sql.=" zeit= 0, ";
$sql.=" kennung='' ";
$sql.=" WHERE userid='".$_SESSION['IDuser']."' ";
$db = new db();
$result=$db->execute($sql);
if($db->affected_rows() == 1)
{
$_SESSION['sit']="";
$_SESSION['IDuser']="";
$meldung="<link href=version1.css rel=stylesheet media=screen><br>Sie haben sich erfolgreich abgemeldet.";
}
else
{
$meldung="<br>Sie waren nicht angemeldet.";
}
return array(TRUE, $meldung);
}

function username()
{
$sql="SELECT nickname FROM user ";
$sql.=" WHERE userid='".$_SESSION['IDuser']."' ";
$db = new db();
$result=$db->execute($sql);
if($db->num_rows() == 1)
{
return $result[1]['nickname'];
}else {return False;}
}
function userid()
{
$sql="SELECT userid FROM user ";
$sql.=" WHERE userid='".$_SESSION['IDuser']."' ";
$db = new db();
$result=$db->execute($sql);
if($db->num_rows() == 1)
{
return $result[1]['userid'];
}else {return False;}
}
function admin()
{
$sql="SELECT admin FROM user ";
$sql.=" WHERE userid='".$_SESSION['IDuser']."' ";
$db = new db();
$result=$db->execute($sql);
if($db->num_rows() == 1)
{
return $result[1]['admin'];
}else {return False;}
}

}//ende class

?>

Soweit funktioniert alles bestens. Nun möchte ich folgende Änderungen vornehmen, bei denen ich Eure Hilfe benötige:
Nachdem der User in das LogIn-Formular seinen Namen und das Passwort eingetragen und das Formular abgesendet hat, erscheint eine neue Seite mit dem Text:"Sie wurden eingeloggt als Username" mit einem klick auf "weiter" kommt der User zur eigentlichen Startseite. Genau diese Zwischenseite möchte ich entfernen. Nch dem Absenden soll direkt die Startseite angezeigt werden.
Analog soll nach einem Klick auf "Ausloggen" der User abgemeldet werden und die LogIn-Seite angezeigt werden.

Könnt Ihr mir mitteilen welche Änderungen ich vornehmen muss? Vielen Dank im Voraus.

defabricator
04.01.2008, 17:11:18
Erklärt das Buch nicht, wie der Code funktioniert?

Entweder streichst Du jedwede Ausgabe und verwendest
header('Location: http://www.zi.el/der/Weiterleitung'); oder
<meta http-equiv="refresh" content="5; URL=http://www.zi.el/der/Weiterleitung">

http://www.php.net/header
http://de.selfhtml.org/html/kopfdaten/meta.htm#weiterleitung

SuperOlli
04.01.2008, 19:05:22
Erklärt das Buch nicht, wie der Code funktioniert?

Entweder streichst Du jedwede Ausgabe und verwendest
header('Location: http://www.zi.el/der/Weiterleitung'); oder
<meta http-equiv="refresh" content="5; URL=http://www.zi.el/der/Weiterleitung">

http://www.php.net/header
http://de.selfhtml.org/html/kopfdaten/meta.htm#weiterleitung

Hallo defabricator,

Danke für Deine schnelle Hilfe.

Das Buch erklärt zwar den Code, jedoch verstehe ich daraus nicht welche Änderungen ich vornehmen muss.

Die Idee mit dem "header" hatte ich auch schon, jedoch wieder verworfen, da vorher schon andere Ausgaben erfolgen und dann Fehlermeldungen auftauchen.

Hilfreich war Dein letzter Vorschlag. Hiermit konnte ich meine Wünsche verwirklichen. Vielen Dank für Deine Hilfe.