suche ein login script für einen admin bereich
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anzahl
connection
database
datei
daten
datensatz
eingeben
error
exit
fehler
formular
login
not
null
pawort
session
transitional
tutorial
update
username
-
da mein provider kein .htaccess unterst?tzt, muss ich mir eine andere variante f?r einen sicheren login einfallen lassen (warscheinlich in php). gibt es da gute und vorallem sichere varianten in php? ( meinentwegen auch in anderen sprachen )
mfG
Beitrag ge?ndert am 17.07.2006 16:20 von personalstereo -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
klar gibt es das, such ma bei google, der is dein freund ;)
zb. "php sicheres lognscript" -
wenn Du es seler nicht schreiben kannst, schau mal hier :
http://www.accessprotect.com/
ansonsten kanste Dier das noch ein wenig sicherer machen !!! und einsetzen :
Achtung:
Dieses Tutorial gew?hrleistet keinerlei Sicherheit des Logins. Die Verwendung der hier vorgestellten Quelltext erfolgt auf
eigene Gefahr.
Aber jetzt mal zum Thema.
Wir m?chten also eine geheime Seite haben, die nur per Login erreicht werden kann. Wir brauchen also auf jeden Fall mal ein
Loginformular.
Die Datei enth?lt keinerlei PHP-Code, da dies nicht unbedingt n?tig ist. Aus diesem Grunde habe ich der Datei auch die
Endung .html gegeben. Das kann nat?rlich je nach Bedarf ge?ndert werden.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head><title>Login</title></head> <body> <h1>Loginformular</h1> <form action="validateLogin.inc.php" method="post"> <input type="text" name="username"> <input type="password" name="passwort"> <input type="submit" name="login" value="Einloggen"> </form> </body> </html>
Das Formular wird an die PHP-Datei "validateLogin.inc.php" geschickt.
Diese Datei ?berpr?ft die Richtigkeit der Eingaben und leitet den User je nach Ergebnis der ?berpr?fung weiter.
Schauen wir uns also diese Datei etwas n?her an.
Die Datei validateLogin.inc.php - das Kernst?ck des Logins
Hier passiert relativ viel. Da wird mit Sessions arbeiten m?ssen wird zun?chst einmal die Session starten.
PHP:
<?php session_start(); ?>
Danach ?berpr?fen wir, ob der User die Eingaben ?berhaupt gemacht hat. Ist dies der Fall, so beginnt die eigentliche
Validierung der Eingaben.
Unser Nutzerdaten sind in einer Datenbank gespeichert. Erst wenn wir sicher sind, dass der Nutzer die Angaben komplett
gemacht hat erstellen wir eine Verbindung zur Datenbank. Dazu binden wir eine Konfigurationsdatei ein, die die Zugangsdaten
zur Datenbank enth?lt.
Danach erstellen wir die Verbindung.
PHP:
<?php // ?berpr?fen, ob das Formular abgeschickt wurde und ob beide Angaben gemacht wurden. if( isset($_POST['username'], $_POST['passwort']) AND strcmp(trim($_POST['username']),'') != 0 AND strcmp(trim($_POST['passwort']),'') != 0 ) { // Einbinden der Konfigurationsdatei include_once 'config.inc.php'; // Erstellen der Verbindung zur MySQL-Datenbank if( !$connection = mysql_connect( $_config['host'], $_config['user'], $_config['password'] ) ) { die( 'Verbindung zum Datenbankserver konnte nicht hergestellt werden.' ); } if( !mysql_select_db( $_config['database'], $connection ) ) { die ( 'Die Datenbank ' . $_config['database'] . ' kann nicht verwendet werden. <br /> MySQL-Error: <br />' . mysql_error() ); } ?>
Nun schicken wir eine SQL-Anweisung an die Datenbank, die den Datensatz selektiert, der dem User entspricht, der sich gerade einloggen m?chte.
Den Datensatz identifizieren wir durch die Kombination aus Usernamen und Passwort.
Das Passwort steht aus Sicherheitsgr?nden nicht im Klartext in der Datenbank, sondern als md5-Verschl?sselung.
PHP:
<?php // SQL-Anweisung an die Datenbank senden, um erstens herauszufinden, ob // diese Kombination von Usernamen und Passwort ?berhaupt existiert und // zweitens bei Existenz Userinformationen auszulesen $sql = "SELECT _id, _anzahlLogins FROM archiv_login WHERE _username = '" . trim($_POST['username']) . "' AND _passwort = '" . md5(trim($_POST['passwort'])) . "'"; $res = mysql_query($sql) or die( 'Error[SELECT|User]: <br /> <pre>' . $sql . '</pre> <br /> MySQL-Error: ' . mysql_error() ); ?>
Nun ist es nat?rlich m?glich, dass es keinen Datensatz mit der angegebenen Kombination aus Usernamen und Passwort gibt.
In diesem Fall ist kein Datensatz selektiert worden.
Sollte aus unvorhersehbaren Gr?nden mehr als einen selektierten Datensatz geben brechen wir den Login aus
Sicherheitsgr?nden ab.
Je nach Bedarf kann man sich f?r diesen Spezialfall noch etwas individuelles ausdenken.
Wir fassen nun diese beiden F?lle allerdings zusammen.
PHP:
<?php // Nur wenn genau ein Datensatz selektiert wurde wird der User eingeloggt. // In allen anderen F?llen wird er zur?ck zum Loginformular geleitet. if( mysql_num_rows($res) != 1 ) { header( 'Location: http://localhost/loginfehler.html' ); exit(); } ?>
Der User wird also zur Datei "loginfehler.html" weitergeleitet, wenn er falsche Logindaten eingegeben hat. Auf diese Datei
gehe ich sp?ter in diesem Tutorial ein, da sie nicht wirklich spannend ist
Viel interessanter ist der Erfolgsfall. Der User hat sich also mit seinen richtigen Daten angemeldet.
Der Login ist also erfolgreich.
In diesem Fall wird die Session mit Informationen gef?llt. Als wichtigste Handlung wird die Variale $_SESSION['loggendIn']
auf true gesetzt. So kann der User im passwortgesicherten Bereich als eingeloggt identifiziert werden.
PHP:
<?php // Der Schl?ssel 'loggedIn' erh?lt den Wert 'true'. So kann sp?ter ?berpr?ft werden, // ob der User eingeloggt ist oder nicht. $_SESSION['loggedIn'] = true; ?> [code] Als Zusatz f?llen wir die Session mit noch einigen weiteren userspezifischen Daten. PHP: [code] <?php // Die userspezifischen Daten werden ausgelesen und der Session hinzugef?gt $user = mysql_fetch_object($res); $_SESSION['anzahlLogins'] = $user->_anzahlLogins; $_SESSION['id'] = $user->_id; ?>
Nun k?nnen wir auch direkt die Anzahl der bisherigen Logins aktualisieren und damit den Login abschlie?en.
Dieses Feature ist nat?rlich optional. Ich m?chte damit nur andeuten, dass diese Datei nat?rlich viel mehr machen kann,
als nur die Logindaten zu ?berpr?fen
PHP:
<?php // Aktualisierung des Anzahl der Logins $sql = 'UPDATE archiv_login SET _anzahlLogins = _anzahlLogins + 1 WHERE _id = ' . $user->_id; mysql_query($sql) or die( 'Error[UPDATE|User]: <br /> <pre>' . $sql . '</pre> <br /> MySQL-Error: ' . mysql_error() ); ?>
Als letzte Handlung dieser Datei wird der User jetzt nat?rlich noch zu einer Seite im gesch?tzten Bereich weitergeleitet.
PHP:
<?php // Der Login war erfolgreich und der User wird zur Startseite des // passwortgesch?tzen Bereichs weitergeleitet header( 'Location: http://localhost/geheim.php' ); exit(); ?>
Kommen wir nun zu den restlichen Dateien, die uns noch fehlen, um ein geschlossenes System zu erhalten.
Zun?chst trage ich noch die Datei "loginfehler.html" nach.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head><title>Fehler beim Login</title> <meta http-equiv="refresh" content="5; URL=http://localhost/loginformular.html"> </head> <body> <h1>Es ist ein Fehler beim Login aufgetreten.</h1> <p>Eventuell handelt es sich nur um einen Tippfehler. Bitte versuchen Sie es nochmals.</p> Sie werden nach 5 Sekunden automatisch weitergeleitet. </body> </html>
Ich denke nicht, dass ich da etwas zu sagen brauche. Die Weiterleitung erfolgt salopp gesagt per 'meta-refresh'.
Dann wurde oben nat?rlich schon die Datei "geheim.php" verwendet. Da wird der User nach dem Login ja hingeleitet.
Diese Datei bindet ganz zu Beginn eine weitere Datei ein.
PHP:
<?php include_once 'checkLogin.inc.php'; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head><title>Geheime Seite</title></head> <body> <h1>Das ist die <i>geheime</i> Seite</h1> <p>Die Daten, die in der Session zum weiteren Gebrauch gespeichert sind:</p> <?php echo '<pre>'; print_r($_SESSION); echo '</pre>'; ?> <p><a href="logout.php">Logout</a></p> </body> </html>
Die Datei "checkLogin.inc.php" macht nur eine einzige Sache. Sie ?berpr?ft, ob die Session-Variable $_SESSION['loggendIn']
mit true belegt ist oder nicht.
Ist dies nicht der Fall, so wird der User zum Loginformular geschickt, da er ja nicht eingeloggt ist. Somit ist
sichergestellt, dass nur eingeloggte User die Seite "geheim.php" zu sehen bekommen.
Die Datei "checkLogin.inc.php" sieht somit folgenderma?en aus:
PHP:
<?php session_start(); if( !$_SESSION['loggedIn'] ) { header( 'Location: http://localhost/loginformular.html' ); exit(); } ?>
Aber nochmal zur?ck zur Datei "geheim.php". In diesem Tutorial ist da nat?rlich nichts interessantes zu sehen.
Es geht ja nur um das Prinzip. Allerdings erkennt man am Ende der Datei noch eine sehr wichtige und oft vergessene
Funktionalit?t - den Logout.
Klickt man auf den Link, so wird die Datei "logout.php" aufgerufen
PHP:
<?php session_start(); $_SESSION['loggedIn'] = false; header( 'Location: http://localhost/loginformular.html' ); exit(); ?>
Ich pers?nlich sehe das nicht so. Ich setze einfach die Variable $_SESSION['loggedIn'] auf false. Dadurch wird abgesichert,
dass der User nach dem Logout nicht mehr in den gesch?tzen Bereich kann (das wird ja durch die Datei "checkLogin.inc.php"
gew?hrleistet!) und die Session kann trotzdem noch weiterverwendet werden.
Sinnvoll w?re es nat?rlich alle Session-Variablen, die irgendwas mit dem gesch?tzten Bereich zu tun haben zu l?schen.
Aber es k?nnen sich ja auch andere Daten in der Session befinden.
Das kann aber jeder f?r sich individuell entscheiden.
loginformular.html Code: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Login</title> </head> <body> <h1>Loginformular</h1> <form action="validateLogin.inc.php" method="post"> <input type="text" name="username"> <input type="password" name="passwort"> <input type="submit" name="login" value="Einloggen"> </form> </body> </html>
validateLogin.inc.php
PHP:
<?php session_start(); // ?berpr?fen, ob das Formular abgeschickt wurde und ob beide Angaben gemacht wurden. if( isset($_POST['username'], $_POST['passwort']) AND strcmp(trim($_POST['username']),'') != 0 AND strcmp(trim($_POST['username']),'') != 0 ) { // Einbinden der Konfigurationsdatei include_once 'config.inc.php'; // Erstellen der Verbindung zur MySQL-Datenbank if( !$connection = mysql_connect( $_config['host'], $_config['user'], $_config['password'] ) ) { die( 'Verbindung zum Datenbankserver konnte nicht hergestellt werden.' ); } if( !mysql_select_db( $_config['database'], $connection ) ) { die ( 'Die Datenbank ' . $_config['database'] . ' kann nicht verwendet werden. <br /> MySQL-Error: <br />' . mysql_error() ); } // SQL-Anweisung an die Datenbank senden, um erstens herauszufinden, ob // diese Kombination von Usernamen und Passwort ?berhaupt existiert und // zweitens bei Existenz Userinformationen auszulesen $sql = "SELECT _id, _anzahlLogins FROM archiv_login WHERE _username = '" . trim($_POST['username']) . "' AND _passwort = '" . md5(trim($_POST['passwort'])) . "'"; $res = mysql_query($sql) or die( 'Error[SELECT|User]: <br /> <pre>' . $sql . '</pre> <br /> MySQL-Error: ' . mysql_error() ); // Nur wenn genau ein Datensatz selektiert wurde wird der User eingeloggt. // In allen anderen F?llen wird er zur?ck zum Loginformular geleitet. if( mysql_num_rows($res) != 1 ) { header( 'Location: http://localhost/loginfehler.html' ); exit(); } else { // Der Schl?ssel 'loggedIn' erh?lt den Wert 'true'. So kann ?berpr?ft sp?ter werden, // ob der User eingeloggt ist oder nicht. $_SESSION['loggedIn'] = true; // Die userspezifischen Daten werden ausgelesen und der Session hinzugef?gt $user = mysql_fetch_object($res); $_SESSION['anzahlLogins'] = $user->_anzahlLogins; $_SESSION['id'] = $user->_id; // Aktualisierung des Anzahl der Logins $sql = 'UPDATE archiv_login SET _anzahlLogins = _anzahlLogins + 1 WHERE _id = ' . $user->_id; mysql_query($sql) or die( 'Error[UPDATE|User]: <br /> <pre>' . $sql . '</pre> <br /> MySQL-Error: ' . mysql_error() ); // Der Login war erfolgreich und der User wird zur Startseite des // passwortgesch?tzen Bereichs weitergeleitet header( 'Location: http://localhost/geheim.php' ); exit(); } } else { header( 'Location: http://localhost/loginformular.html' ); exit(); } ?>
loginfehler.html
Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Fehler beim Login</title> <meta http-equiv="refresh" content="5; URL=http://localhost/loginformular.html"> </head> <body> <h1>Es ist ein Fehler beim Login aufgetreten.</h1> <p>Eventuell handelt es sich nur um einen Tippfehler. Bitte versuchen Sie es nochmals.</p> Sie werden nach von 5 Sekunden automatisch weitergeleitet. </body> </html>
geheim.php
PHP:
<?php include_once 'checkLogin.inc.php'; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Geheime Seite</title> </head> <body> <h1>Das ist die <i>geheime</i> Seite</h1> <p>Die Daten, die in der Session zum weiteren Gebrauch gespeichert sind:</p> <?php echo '<pre>'; print_r($_SESSION); echo '</pre>'; ?> <p><a href="logout.php">Logout</a></p> </body> </html>
checkLogin.inc.php
PHP:
<?php session_start(); if( !$_SESSION['loggedIn'] ) { header( 'Location: http://localhost/loginformular.html' ); exit(); } ?>
logout.php
PHP:
<?php session_start(); $_SESSION['loggedIn'] = false; header( 'Location: http://localhost/loginformular.html' ); exit(); ?>
SQL-Export
# # Table structure for table `archiv_login` # CREATE TABLE `archiv_login` ( `_id` int(4) NOT NULL auto_increment, `_username` varchar(50) NOT NULL default '', `_passwort` varchar(35) NOT NULL default '', `_anzahlLogins` int(7) NOT NULL default '1', PRIMARY KEY (`_id`), KEY `_username` (`_username`) ) TYPE=MyISAM AUTO_INCREMENT=3 ; # # Dumping data for table `archiv_login` # <?php // Array initialisieren ... $_config = array(); // ... und mit Werten f?llen // Der Datenbankserver. $_config['host'] = 'localhost'; // Ein User, der auf den Server zugreifen darf. $_config['user'] = 'user'; // Das zum User passende Passwort. $_config['password'] = 'password'; // Der Name der Datenbank, die auf dem Datenbankserver angesprochen werden soll. $_config['database'] = 'database'; ?>
Beitrag ge?ndert am 18.07.2006 13:33 von pit62 -
danke, damit kann ich doch schon mal was anfangen!
btw nn google posts! auf die idee komm ich schon selbst, aber wollte mich mal im forum umh?ren, weil man bei lima-city ja kein .htaccess benutzen kann. ich werde mich jetzt mal mit einem script besch?ftigen
danke ihrs -
Hier auch ein ganz einfaches:
formular.php
<? include("#zugang.php"); ?> <html> <head></head> <body> <form method="post" action="formular.php"> Username: <input name="user"><br> Kennwort: <input name="pass" type="password"><br> <input type= "submit" value="OK"> </form> <? $user = $_POST['user']; $pass = $_POST['pass']; if ($user == $user_ok && $pass == $pass_ok) include("#geheim.inc"); else echo "Falsche Eingabe!"; ?> </body> </html>
zugang.php
<? $user_ok = "Nilpferd"; $pass_ok = "hippo1"; ?>
#geheim.inc:
<hr> <h1>Guten Tag,</h1> <p>diese Webseite wird nur nach Eingabe des Benutzernamens <?= $user_ok;?> und des Kennwortes <?= $pass_ok; ?> angezeigt.</p>
-
Ich w?rde diese Angaben, noch escapen, sch?tzt vor mysql_injection
Beispiel:
.... include 'sicherheit.php'; $pw = sha1($_POST['pw']);; $us = $_POST['user']; $neupw = mysql_string($pw); $neuus = mysql_string($us); ....
sicherheit.php
function mysql_string($string) { if (get_magic_quotes_gpc()) { $string = stripslashes($string); } return "'".mysql_real_escape_string($string)."'"; }
-
sehr nett von euch, bisher hatte ich nur wenig zeit mich genug damit zu besch?ftigen, aber ich denke dieses wochenende werde ich die zeit daf?r finden!
thanks -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage