Webseiten schützen über eine user-datenbank in mysql
André
- php
Hi!
Bin gerade dabei ein Script zu bauen, zum Schutz von Webseiten.(Vielmehr der Versuch das Script aus einem Buch nachzubauen.) Das ganze läuft über eine Anbindung an eine Datenbank. Useradministration funktioniert soweit ganz gut. Beim Login wird ein Cookie und eine Sitzungskennung gesetzt. An der Stelle auf der Login-Seite komm ich nicht weiter und bleibe hängen bei "Sie sind bereits eingeloggt.".
Scheiß ich kommme nicht drauf woran es liegt. Ich häng meine Dateien mal in die erste Antwort. connect.php, login.php, logout.php, useradmin.php, Struktur DB.
Vielleicht hat ja einer ne Idee. Schon mal Danke an die Gemeinde. André
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
connect.php connect.php connect.php connect.php connect.php
<?php $link=mysql_connect("localhost", "root", ""); mysql_select_db("db_user", $link); $idle=10;//Minuten, die ein User ohne nochmaliges anmelden zwischen zwei Aufrufen geschützter Webseiten verstreichen lassen darf
function benutzer() { Global $link, $IDuser,$sit; $tabellenname = 'tab_user'; $sql="SELECT username FROM $tabellenname WHERE ID='$IDuser' AND kennung ='$sit'"; $result=mysql_query($sql,$link); if(mysql_num_rows($result)==1) { return mysql_result($result,0,'username'); } }
function recht($admin) { Global $link,$IDuser,$sit,$idle; $pfad="../../login.php"; $tabellenname='tab_user';
if(!$IDuser OR !$sit) { $fehler=1; } else { if(!$link) { $fehler=2; } else { $sql="SELECT admin, zeit, kennung, (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(zeit)) as time FROM $tabellenname WHERE ID='$IDuser' AND kennung='$sit'"; $result=mysql_query($sql,$link); if(mysql_num_rows($result)==1) { if($admin==1 AND mysql_result($result,0,'admin')!=1) { $fehler=1; } if(mysql_result($result,0,'time')/60>$idle) { $fehler=3; } } else { $fehler=1; } } }
if($fehler) { switch($fehler) { case 1: die("<html><body><div align=center><h1>Sie haben keine Zugriffsrechte auf diese Seite</h1><a href='$pfad'>zum Log In</a></div></body></html>"); break; case 2: die("<html><body><div align=center><h1>Ein Datenbankfehler verhindert die Authentifizierung, bitte versuchen Sie es später noch einmal!</h1></div></body></html>"); break; case 3: die("<html><body><div align=center><h1>Ihre SitzungsID ist aufgrund zu langer Inaktivitä nicht mehr gütig, bitte melden Sie sich erneut an!</h1><a href='$pfad'>zum Log In</a></div></body></html>"); break; } } else { $sql="UPDATE $tabellenname SET "; $sql.=" zeit= now() "; $sql.=" WHERE ID='$IDuser' "; @mysql_query($sql, $link);
if(mysql_result($result,0,'admin')==1) { return true; } else { return false; }
} mysql_free_result($result); } ?> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
login.php login.php login.php login.php login.php login.php
<?php require('admin/user/connect.php'); echo benutzer(); $tabellenname='tab_user';
if($sent==1) { $sql="SELECT kwort, ID, kennung, (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(zeit)) as time FROM $tabellenname WHERE username='$username' "; $result=mysql_query($sql,$link); if(mysql_num_rows($result)==1) { if(md5($kwort)!=mysql_result($result,0,'kwort')) { $meldung.="Bitte kontrollieren Sie Ihr Kennwort!"; } else { if(mysql_result($result,0,'kennung')==$sit AND mysql_result($result,0,'time')/60<$idle) { $meldung.="Sie sind bereits eingeloggt"; unset($username); } else { if(mysql_result($result,0,'kennung')!='' AND mysql_result($result,0,'time')/60<$idle) { $meldung.="Es ist bereits jemand mit Ihrem Benutzernamen eingeloggt"; } else { $sitzung=uniqid(''); $IDuser=mysql_result($result,0,'ID'); $sql="UPDATE $tabellenname SET "; $sql.=" zeit= now(), "; $sql.=" kennung='$sitzung' "; $sql.=" WHERE ID='$IDuser' "; $test=mysql_query($sql,$link); setcookie('sit',$sitzung); setcookie('IDuser',$IDuser); $meldung="Sie wurden eingeloggt als $username"; unset($username); } } }
} else { $meldung.="Bitte kontrolieren Sie Ihren Benutzernamen"; }
} ?>
<?php
echo "<html><head><title>LOGIN User</title></head><body>"; echo "<h2><font color=red>$meldung</font></h2>"; echo "<h2>Bitte die Benutzerinformationen eingeben</h2>"; echo "<form action='$PHP_SELF' method='post'>"; echo "<input type=hidden name=sent value=1 />"; echo "<p>Benutzername</p>"; echo "<input type=text name=username value='$username' />"; echo "<p>Kennwort</p>"; echo "<input type=password name=kwort />"; echo "<br /><br /><input type=submit>"; echo "</form></body></html>"; ?> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
logout.php logout.php logout.php logout.php logout.php logout.php
<?php require ('admin/user/connect.php'); recht(1); $tabellenname='tab_user';
if($sent==1) { $sql="UPDATE $tabellenname SET "; $sql.=" zeit= 0, "; $sql.=" kennung='' "; $sql.=" WHERE ID='$IDuser' "; @mysql_query($sql,$link); setcookie('sit', '',time()-1000); setcookie('IDuser', $IDuser, time()-1000); unset ($IDuser); }
echo "<html><head><title>LOGOUT-User</title></head><body>"; if($IDuser) { echo "<h2><font color=red>$meldung</font></h2>"; echo "<h2>Sie sind angemeldet als ".benutzer()."<br />"; echo "Abmelden?</h2>"; echo "<form action='$PHP_SELF' method='post'>"; echo "<input type=hidden name=sent value=1 />"; echo "<br /><br /><input type=submit>"; echo "</form>"; } else { echo "Sie sind abgemeldet"; } echo "</body></html>"; ?> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
useradmin.php useradmin.php useradmin.php useradmin.php
<?php require('connect.php'); //recht(1); ?> <html> <head> <title>Userverwaltung</title> </head> <body> <table width="200" border="1"> <tr> <td><img src="../images/clearpixel.gif" width="20" height="20"></td> <td><img src="../images/clearpixel.gif" width="452" height="20"></td> </tr> <tr> <td> </td> <td> <?php $tabellenname='tab_user';
//Alegen eines neuen Users if($sent==1) { $sql="INSERT INTO $tabellenname() VALUES() "; @mysql_query($sql,$link); if(mysql_insert_id()>0) { $ID=mysql_insert_id(); $meldung="Ein neuer User wurde angelegt<br />"; } else { $meldung="Es konnte kein neuer User angelegt werden. Bearbeiten Sie zuvor neu angelegte User und ändern Sie den Usernamen, bevor Sie einen weiteren neuen User anlegen.<br />"; } }
//Speichern der bearbeitenden Userinformationen if($sent==2) { if($kwort!='' AND (strlen($kwort)<6 OR strlen($kwort)>12)) { $meldung.="Das Kennwort hat nicht die richtige Länge <br />"; unset($kwort); }
$sql="UPDATE $tabellenname SET";
if($kwort!='') { $kwort2=md5($kwort); $sql.=" kwort='$kwort2', "; }
$sql.=" username='$username', "; $sql.=" admin='$admin', "; $sql.=" beschreibung='$beschreibung' "; $sql.=" WHERE ID='$ID' "; $test=mysql_query($sql,$link);
if($kwort!='' AND !$test) { $meldung.="Die Änderung konnten nicht gespeichert werden, das alte Kennwort ist noch gültig <br />"; } if($kwort!='' AND $test) { $meldung.="Das neue Kennwort - $kwort - ist jetzt gültig<br />"; } }
//Löschen eines Users if($sent==3) { $sql="DELETE FROM $tabellenname WHERE ID=$ID"; @mysql_query($sql,$link); unset($ID); }
echo "<h2>$meldung</h2>";
//Auslesen der vorhandenen User und Auswahlformular anzeigen $sql="SELECT * FROM $tabellenname ORDER BY username"; $result=mysql_query($sql,$link); if(mysql_num_rows($result)>0) { echo "<h2>Bitte den User zum Bearbeiten auswählen</h2>"; echo "<form action='$PHP_SELF' method='post'>"; echo "<select name='ID'>"; for($i=0;$i<mysql_num_rows($result);$i++) { $ID1=mysql_result($result,$i,'ID'); $username=mysql_result($result,$i,'username'); echo "<option value=$ID1"; if($ID==$ID1){echo " selected ";} echo ">$username"; } echo "</select><br /><br />"; echo "<input type=submit />"; echo "</form>"; }
//Das Formular zum Bearbeiten if($ID) { $sql="SELECT * FROM $tabellenname WHERE ID=$ID"; $result=mysql_query($sql,$link); if(mysql_num_rows($result)==1) { $ID1=mysql_result($result,0,'ID'); $username1=mysql_result($result,0,'username'); $kwort1=mysql_result($result,0,'kwort'); $admin1=mysql_result($result,0,'admin'); $beschreibung1=mysql_result($result,0,'beschreibung'); echo "<h2>Bitte den User $username1 bearbeiten</h2>"; echo "<form action='$PHP_SELF' method='post'>"; echo "<input type=hidden name=sent value=2 />"; echo "<input type=hidden name=ID value=$ID1 />"; echo "<p>Benutzername</p>"; echo "<input type=text name=username value='$username1' />"; echo "<p>Kennwort <br /><font color=red>Bitte leer lassen, wenn es nicht geändert werden sol!</font></p>"; if($kwort1=='kennwort'){echo "<p><font color=red size=+1>Sie müssen das Kennwort noch angeben, damit sich der User anmelden kann.</font></p>";} echo "<input type=text name=kwort value='' />"; echo "<p>Beschreibung</p>"; echo "<input type=text name=beschreibung value='$beschreibung1' />"; echo "<p>Administrator</p>"; echo "<input type=radio name=admin value=-1"; if($admin1==-1){echo " checked ";} echo " />Nein ------"; echo "<input type=radio name=admin value=1"; if($admin1==1){echo " checked ";} echo " />Ja"; echo "<br /><br /><input type=submit />"; echo "</form>";
echo "<br /><a href='$PHP_SELF?sent=3&ID=$ID1'><font size=+1>Den angezeigten User löschen</font></a>"; } }
echo "<br /><a href='$PHP_SELF?sent=1'><font size=+1>Einen neuen User anlegen</font></a>"; ?> </td> </tr> </table> </body> </html> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Struktur DB Struktur DB Struktur DB Struktur DB Struktur DB
tab_user
CREATE TABLE tab_user ( ID int(14) unsigned NOT NULL auto_increment, username char(50) binary default 'neueruser', kwort char(50) binary default 'kennwort', admin tinyint(2) default '-1', beschreibung char(255) default NULL, kennung char(50) default NULL, zeit datetime default NULL, PRIMARY KEY (ID), UNIQUE KEY username (username) ) TYPE=MyISAM;
Hi André,
das sit ja Stoff genug fürn Beratungsvertrag. Hätte ich heute aber auch gebrauchen können :-))
So ganz auf die Schnelle:
Bau mal Kontrollmeldungen ein z.B. mit if (DEBUG) {echo "bla!<br>");
Und ganz vorne irgendwo schreibst Du halt hin define("DEBUG",TRUE);
Und lässt Dir an allen fraglichen Stellen alle möglichen Daten ausgeben.
Und dann fiel mir auf, dass das Cookie_destroy vielelcht nur mit setcookie("Cookiename"); ohne weitere Zeitangaben passieren sollte. Ich denke, dass das neue Cookie einfach ignoriert wird, wenn es in der Vergangenheit liegt. Hast Du schonmal nachgeschaut, ob das tatsächlich verschwindet?
Grüße
Tom
Hallo André,
ich habe mir Deinen Quellcode durchgesehen und bitte Dich, doch mal Deine grundsätzlichen Überlegungen dazu im Klartext zu posten.
Also:
Benutzer ruft Seite auf
Formular erscheint
Benutzer trägt Namen und Passwort ein
...
Man nennt sowas auch Programmbeschreibung.
Außerdem kann ich noch nicht das Konzept des Seitenschutzes sondern nur eines recht komplizierten Anmeldeverfahrens erkennen.
Interessiert mich aber. Bin an einer ähnlichen Geschichte ganz ohne MySQL dran.
Grüße aus http://www.braunschweig.de
Tom
Hi,
erstmal vielen Dank. Probiere Empfehlung gleich aus.
Dokumentation folgt noch. Bin gerade dabei mein Abschlußprojekt abzugeben, deswegen bitte noch ein wenig Geduld (wahrscheinlich 1. Novemberwoche). Meine Projekt-Mitstreiter warten auch schon.
(Ja Ja ich weiß eine ordentliche Doku muß sein. Nachlässig nachlässig.;-))
Vorab:
Über useradmin.php werden user in tab_user gespeichert.
In connect.php sind zwei Funktionen benutzer(), recht(). Eingebunden in die ausgesuchten Webseiten, wird eine bestimmt Rechtevergabe ermöglicht.
Grüße nach BS