Passwortschutz mit PHP sicher?
Stefan E
- php
Hallo zusammen
Ich möchte einen Passwortschutz mittels PHP realisieren, welcher am Anfang jeder Seite included wird.
Der Passwortschutz überprüft ob eine Session besteht. Wenn nicht wird eine Loginmaske angezeigt und nachher der PHP Befehl exit ausgeführt welcher das weiter Aussführen PHP unterbricht. und nach der Eingabe der Userdaten wird überpfrüft ob die Logindaten mit den gespeicherten Daten aus dem config File übereinstimmen (Passwort evtl. md5 verschlüsselt).
Wenn nun die Eingabe stimmt wird eine Session gestartet und der User kann normal weiter Serven.
Noch einmal schematisch Aufgezeigt:
irgend_eine_datei.php
<code>
<?php
include("security.php");
der restliche code;
?>
</code>
security.php
<code>
<?php
session!=ok {
loginmaske();
exit;
}
?>
</code>
mein Frage nun. Ist das ganze sicher, wenn die security.php zuoberst in jeder Datei eingebunden wird und am ende der Loginmaske mit exit das ganze Script gestoppt wird??
vielen Dank für eure Mühe.
Hi,
mein Frage nun. Ist das ganze sicher, wenn die security.php zuoberst in jeder Datei eingebunden wird und am ende der Loginmaske mit exit das ganze Script gestoppt wird??
ich bin mir nicht sicher, aber ich denke das ein header("Location: ..") sicherer ist.
MfG
Hi Daniel,
ich bin mir nicht sicher, aber ich denke das ein header("Location: ..") sicherer ist.
Wie kommst du auf diese - sorry, blöde - Idee? Dann bräuchte man doch nur die direkte URL kennen, diese in den Browser eintippen und schon wäre man auf der geschützten Seite. Und glaube mir: Es ist überhaupt nicht schwer festzustellen, was du für eine URL bei Location angegeben hast.
MfG, Dennis.
Hi,
Wie kommst du auf diese - sorry, blöde - Idee? Dann bräuchte man doch nur die direkte URL kennen, diese in den Browser eintippen und schon wäre man auf der geschützten Seite. Und glaube mir: Es ist überhaupt nicht schwer festzustellen, was du für eine URL bei Location angegeben hast.
ich glaube du hast mich falsch verstanden, er soll ne weiterleitung zu
loginmaske machen anstatt sie zu includen und das script der aktuellen seite mit exit() zu beenden.
MfG
Hi Daniel,
ich glaube du hast mich falsch verstanden, er soll ne weiterleitung zu
loginmaske machen anstatt sie zu includen und das script der aktuellen seite mit exit() zu beenden.
Ok, trotzdem darf dieses Statement nicht unkommentiert stehen bleiben, damit kein später im Archiv Lesender es mißversteht.
Ja, auf die Loginmaske umzuleiten würde gehen und hat insofern den Vorteil, dass man nicht in jeder Datei das Login Formular notieren bzw. includen muss. Trotzdem hat die von Stefan gewählte Methode (sofern nicht irgendwie das exit; verloren gegangen ist) von der Sicherheit her keinen Nachteil gegenüber einem Location Header.
MfG, Dennis.
Moin!
Ja, auf die Loginmaske umzuleiten würde gehen und hat insofern den Vorteil, dass man nicht in jeder Datei das Login Formular notieren bzw. includen muss.
Die Prüfung, ob der Benutzer angemeldet ist, muß trotzdem überall includiert werden. Wo ist dann der Vorteil?
Trotzdem hat die von Stefan gewählte Methode (sofern nicht irgendwie das exit; verloren gegangen ist) von der Sicherheit her keinen Nachteil gegenüber einem Location Header.
Richtig. Und sie hat den Vorteil, dass man auf der gleichen Seite bleiben kann und diese nach erfolgter Anmeldung direkt sieht. So werden Bookmarks auf Unterseiten möglich, die man immer direkt anspringen kann, egal ob man schon angemeldet ist, oder nicht.
Bei einem Sprung auf eine Anmeldeseite müßte diese dann ihrerseits wieder zurück zur gewünschten und vorher angeforderten Seite springen.
Vielen Dank für eure zahlreichen und guten Antworten.
Ich werd es mit der exit Variante programmieren. Ich war mir nur nicht sicher ob das exit total sicher ist. man kann ja immer noch nach dem exit eine header("Location: ...") machen fals das exit versagt hat, was ja aber nicht passieren sollte.
Hi Stefan,
Ich war mir nur nicht sicher ob das exit total sicher ist. man kann ja immer noch nach dem exit eine header("Location: ...") machen fals das exit versagt hat, was ja aber nicht passieren sollte.
Joa, klar, kannst du das machen, sei dir aber bewusst, dass nach header("Location: ..."); das Script _keinenfalls_ direkt abgebrochen wird! Im Gegenteil, das Script wird noch weiter durchgearbeitet, was du z.B. dann merkst, wenn du nachher noch eine Datenbank Operation durchführen lässt oder so etwas. Nach einem Header Location sollte also im Normalfalls sowieso ein exit; kommen (wenn du nicht wirklich noch das Script was machen lassen willst).
MfG, Dennis.
mein Frage nun. Ist das ganze sicher, wenn die security.php zuoberst in jeder Datei eingebunden wird und am ende der Loginmaske mit exit das ganze Script gestoppt wird??
Hallo Stefan
Ja. Du solltest aber darauf achten, dass, wenn die security.php nicht gefunden wird, das script abgebrochen wird, also z.B.
@include('security.php') or die('anmeldedatei nicht gefunden. bitte webmaster kontaktieren');
übrigens: <code> bringt dir hier nix, weil html-tags nicht erkannt werden. nimm stattdessen (eckige klammer)code lang=php] und (eckige klammer)/code]
Marian
Hi Marian,
Ja. Du solltest aber darauf achten, dass, wenn die security.php nicht gefunden wird, das script abgebrochen wird, also z.B.
Richtig, aber...
@include('security.php') or die('anmeldedatei nicht gefunden. bitte webmaster kontaktieren');
So kompliziert brauchst du es gar nicht machen - den PHP kennt hierzu schon die Funktion require(), da gibt einen Fatal Error wenn die Datei nicht existiert und nicht wie bei include() nur eine Warning.
MfG, Dennis.
Ich möchte einen Passwortschutz mittels PHP realisieren, welcher am Anfang jeder Seite included wird.
Der Passwortschutz überprüft ob eine Session besteht. Wenn nicht wird eine Loginmaske angezeigt und nachher der PHP Befehl exit ausgeführt welcher das weiter Aussführen PHP unterbricht. und nach der Eingabe der Userdaten wird überpfrüft ob die Logindaten mit den gespeicherten Daten aus dem config File übereinstimmen (Passwort evtl. md5 verschlüsselt).
mein Frage nun. Ist das ganze sicher, wenn die security.php zuoberst in jeder Datei eingebunden wird und am ende der Loginmaske mit exit das ganze Script gestoppt wird??
Also ich hab sowas auch gemacht. Ich speichere das passwort und den name als cookie(das passwort natürlich md5) und include das login.inc.php einfach.
login.inc.php
<?php
$username = $_COOKIE['username'];
$password = $_COOKIE['password'];
if(!empty($_POST['username']))
$username = $_POST['username']; //formular-wert überschreibt cookie
if(!empty($_POST['password']))
$password = md5($_POST['password']);
//testen, ob $password zu $username passt (z.b. datenbank)
$logged = $password == $wie_es_sein_sollte; // (beides ist md5-verschlüsselt)
if($logged)
{
setcookie('username', $username);
setcookie('password', $password, 300); //verfällt nach 5 minuten
if(!empty($_POST['password']))
echo '<script type="text/javascript">window.alert("Sie wurden angemeldet")</script>';
//nur wenn per formular angemeldet, nicht bei cookie; d.h. nur beim ersten mal
}
else
{
?>
<!--doctype, html, head, title, body und so-->
<form method="post" action="<?php echo $_SERVER['REQUEST_URI'] ?>">
Name: <input name="username" value="<?php echo $username ?>"><br>
Passwort: <input type="password" name="password"><br>
<input type="submit" value="Anmelden">
</form>
<?php
exit()
}
?>
Kannst ja mal ausprobieren...
Gruß, Marian