zyrusthc-linux.no-ip.org

A Linux Fan Page .... Shellscripts , Mohaa - Cod2 - Battlefield2 - CS - CSS - ET Webinterface ......

Logo zyrusthc-linux.no-ip.org
Dienstag, 27. Oktober 2020
  • Benutzer

  • Besucher
    Heute:
    150
    Gestern:
    232
    Gesamt:
    343.636
  • Benutzer & Gäste
    3668 Benutzer registriert, davon online: 35 Gäste
 
Start Einloggen Einloggen Die Mitglieder Das Foren-Team Suchfunktion
1932 Beiträge & 333 Themen in 13 Foren
Keine neuen Beiträge, seit Ihrem letzten Besuch am 27.10.2020 - 13:07.
  Login speichern
Forenübersicht » Projekt Webinterface » Wie füge ich dem WI ein PHP gestütztes LogIn hinzu?

vorheriges Thema   nächstes Thema  
4 Beiträge in diesem Thema (offen)
Autor
Beitrag
Deichgraf ist offline Deichgraf  
Themenicon    Wie füge ich dem WI ein PHP gestütztes LogIn hinzu?
7 Beiträge - Einmalposter
Hallo,

nachdem ich mehrfach und vergeblich versucht hatte, das WI via .htaccess und .htpasswd zu schützen, hab ich mich nach einer Alternative umgesehen, und meinem WI ein Login via PHP hinzugefügt:

Das System wird mittels Sessions umgesetzt (engl. Session = Sitzung). In PHP ist eine Session im Prinzip eine Datei, die sich im Dateisystem des Webservers befindet. In ihr sind Daten gespeichert, auf die man über den speziellen Array $_SESSION zugreifen kann. Jeder Benutzer, der mit seinem Browser eine Seite aufruft, die Sessions benutzt, bekommt nun vom Server eine einmalige Session-ID zugewiesen, über die er identifiziert werden kann. Dadurch ist es möglich, Daten benutzerbezogen zu speichern, die während einer Sitzung wiederverwendet werden können. Anwendungsmöglichkeiten sind zum Beispiel ein Warenkorb beim Einkaufen im Internet oder eine Administrationsoberfläche für ein Content Management System (z.B. PHPKit).

Das hier beschriebene Loginsystem umfasst die 3 Dateien login.php, logout.php und auth.php, welche sich alle im selben Verzeichnis befinden. Die Datei login.php beinhaltet sowohl das Formular zum Anmelden als auch die Routinen, um die Benutzerdaten zu verarbeiten und bei erfolgreicher Anmeldung entsprechende Daten in die Session zu speichern. Die Datei logout.php zerstört die Sitzungsdaten und meldet so den Benutzer ab. auth.php enthält den essentiellen Teil, nämlich die Überprüfung, ob der Benutzer aktuell angemeldet ist und somit berechtigt, das angeforderte Dokument anzusehen. Diese Datei wird in jedes zu schützende Dokument eingebunden. Hier die original Index.php des Webinterface.




Die "login.php"

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
session_start();

$username = $_POST['username'];
$passwort = $_POST['passwort'];

$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);

// Benutzername und Passwort werden ueberprueft
if ($username == 'DEIN_USER_HIER' && $passwort == 'DEIN_PASSWORT_HIER') {
$_SESSION['angemeldet'] = true;

// Weiterleitung zur geschuetzten Startseite
if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
if (php_sapi_name() == 'cgi') {
header('Status: 303 See Other');
}
else {
header('HTTP/1.1 303 See Other');
}
}

header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/index.php');
exit;
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<title>Geschuetzter Bereich</title>
</head>
<body>
<form action="login.php" method="post">
<center>Username: <input type="text" name="username" /><br /></center>
<center>Passwort: <input type="password" name="passwort" /><br /></center>
<input type="submit" value="Anmelden" />
</form>
</body>
</html>



Der Programmcode in dieser Datei ist für den Anmeldeprozess zuständig. Das Skript prüft zuerst, ob der Benutzer schon angemeldet ist. Ist das nicht der Fall, wird ein Formular angezeigt, welches Benutzername und Passwort über die Methode POST wieder an die Datei login.php sendet, um dann wiederum weiterverarbeitet zu werden. Hier sind sowohl Benutzername als auch Passwort im Quelltext fest einprogrammiert.

Wurden Benutzername und Passwort korrekt eingegeben, wird in der am Anfang des Skripts geöffneten Session eine Variable mit dem Namen angemeldet und dem Wert true gespeichert.

Im nächsten Schrit wird der Benutzer auf die Datei index.php weitergeleitet. Dies geschieht mittels der Funktion header('Location: ...'). Da die Location-Anweisung einen vollständigen URI erwartet, man diesen vielleicht aber aus Bequemlichkeit nicht für jedes Projekt ändern will oder den künftigen URI noch nicht kennt, wird er aus Servervariablen zusammengebaut, so dass man nur noch den letzten Teil an seine Bedürfnisse anpassen muss. Im Beispiel befindet sich die Datei index.php im selben Verzeichnis wie login.php.

Waren Benutzername oder Passwort falsch, wird wieder das Login-Formular angezeigt – der Benutzer muss die Zugangsdaten erneut eingeben.

Der HTTP Statuscode "303 See Other" wird hier aus Gründen der Standardkonformität gesendet: Bei einem Location-Header sendet PHP standardmäßig den Statuscode 302, nur ist hier nicht definiert, ob der nachfolgende Weiterleitungsrequest per POST oder GET getätigt werden soll. HTTP/1.1 wurde daher unter anderem um die Statuscodes 303 und 307 erweitert, die genau das festlegen. Ältere Browser, die nur HTTP/1.0 implementiert haben, bleiben bei der Abfrage nach $_SERVER['SERVER_PROTOCOL'] außen vor, bekommen so den obligatorischen Statuscode 302 und reagieren darauf, wie sie programmiert wurden. In fast allen dieser älteren Browser wird die nächste Seite dann per GET angefordert.



Wichtig:
Achtet darauf, dass die Passwörter gut gesichert sind. Der beste Passwortschutz nützt nichts, wenn Passwörter im Klartext gespeichert sind und im schlimmsten Fall sogar über den Browser gelesen werden können. Auch im Beispiel ist darauf zu achten, dass die Datei login.php nicht für andere Systembenutzer auf dem Webserver lesbar ist. Am bequemsten ist es, wenn eine (z.B. MySQL-)Datenbank mit eigenem Benutzernamen zur Verfügung steht, auf die niemand anderes Zugriff hat. Um zusätzlich an Sicherheit zu gewinnen, kann es außerdem sinnvoll sein, die Passwörter zusätzlich zu verschlüsseln, bzw. nur dessen Hash-Wert zu speichern, beispielsweise per md5-Funktion.



Die "logout.php"

<?php
session_start();
session_destroy();

$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);

header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/login.php');
?>


Die Datei logout.php ist einzig und allein dafür zuständig, die Session - und damit die Information, dass der Benutzer angemeldet ist - zu zerstören. Danach wird der Benutzer wieder zum Anmeldeformular weitergeleitet. (Hier liegt mein Problem, dazu aber später mehr!)



Die "auth.php"

<?php
session_start();

$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);

if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) {
header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/login.php');
exit;
}
?>


Dies ist die Datei, die später in jede zu schützende Seite eingebunden werden muss. Es wird dann immer überprüft, ob die Sessionvariable angemeldet existiert und ihr Wert true ist. Falls das nicht der Fall ist, wird der Benutzer wieder zum Anmeldeformular weitergeleitet. Wichtig ist hier die exit-Anweisung nach der Weiterleitung, damit kein weiterer Code ausgeführt werden kann und das Skript sofort beendet wird.



Und nun die zu schützenden Datei, hier die original "index.php" des WI

<?php include('auth.php'); ?>
<HTML>
<HEAD>
<TITLE>zyrusthc.homeip.net Webinterface 1.3</TITLE>
</HEAD>
<frameset cols="18%,82%">
<frame name="menu" src="frame.php" noresize marginwidth="10" marginheight="10">
<frame name="anzeige" src="start.php" scrolling="yes" noresize marginwidth="10" marginheight="10">
</frameset>
<BODY>
</BODY>
</HTML>


//Anm. Ich:
//Ich habe hier im oberen Bereich die Information "<?php include('auth.php'); ?>" eingefügt, um
//die "auth.php" zu includieren.

Die erste und einzige Anweisung, die eine geschützte Seite enthalten muss, ist der Befehl zum Einbinden der Datei auth.php, nämlich include in der ersten Zeile. Der Rest der Datei kann eine ganz normale HTML-Seite sein. Wenn Sie mehrere Dokumente schützen wollen, müssen Sie diese Zeile einfach am Anfang jeder Datei einfügen. Solange der Benutzer sich nicht explizit abgemeldet hat - ein Link zum Abmelden sollte natürlich immer vorhanden sein - ist keine weitere Eingabe des Passworts nötig.



Als erstes mal sei noch gesagt, das die Scripts nicht von mir designed worden sind. Ich habe diese HIER gefunden und für meine Zwecke angepasst.

Soweit so gut. Es funktionert auch. Wenn ich also die index.php im Browser aufrufe, werde ich zuerst aufgefordert einen User und ein Paßwort einzugeben. Tue ich dies nicht, oder mache ich es nicht richtig, komme ich nicht ins WI rein. Mache ich alles richtig, wird mir das WI in seiner ganzen Pracht angezeigt und ich kann unsere Server starten/stoppen usw.

Damit ich auch die Möglichkeit habe, mich vom Webinterface auch wieder abzumelden habe in der Datei "Start.php" die für die rechte, grosse Seite des WI zuständig ist folgende Änderungen vorgenommen:

Die original "start.php" des WI

<?php
// ------------------------------------------------------------ -----------------------------
// http://zyrusthc.homeip.net
// Webinterface v.1.3
// (c) 2006 Zyrusthc
//
// Autor: Zyrusthc, zyrus@zyrusthc.homeip.net
// Stand: 15.01.2006
// License: GNU General Public License as published by
// the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
// ------------------------------------------------------------ -----------------------------
// required PHP version: at least 4.3.3
// ------------------------------------------------------------ -----------------------------
// File : start.php
// ------------------------------------------------------------ -----------------------------

echo "<html><body background=\"images/background.gif\"><hr>
<center><h3>Willkommen im Webinterface v1.3</h3></center><hr><br><br>
<hr><center><h5>Spiel auswählen um den Server zu barbeiten</h5></center><hr>
<table align=\"center\">";

$total = "RAM Total : ";
$free = "RAM Frei : ";
$use = "RAM Benutzt : ";
$cache = "RAM Cache : ";
$buffer = "RAM Buffer : ";
$swaptotal ="Total : ";
$swapfree = "Frei : ";
{
if ($fd = fopen('/proc/meminfo', 'r'))
while ($buf = fgets($fd, 4096)) {
if (preg_match('/^MemTotal:\s+(.*)\s*kB/i', $buf, $ar_buf)) {
$results['ram']['total'] = $ar_buf[1];
}

else if (preg_match('/^MemFree:\s+(.*)\s*kB/i', $buf, $ar_buf)) {
$results['ram']['free'] = $ar_buf[1];
} else if (preg_match('/^Cached:\s+(.*)\s*kB/i', $buf, $ar_buf)) {
$results['ram']['cached'] = $ar_buf[1];
} else if (preg_match('/^Buffers:\s+(.*)\s*kB/i', $buf, $ar_buf)) {
$results['ram']['buffers'] = $ar_buf[1];
} else if (preg_match('/^SwapTotal:\s+(.*)\s*kB/i', $buf, $ar_buf)) {
$results['swap']['total'] = $ar_buf[1];
} else if (preg_match('/^SwapFree:\s+(.*)\s*kB/i', $buf, $ar_buf)) {
$results['swap']['free'] = $ar_buf[1];
}
} }

echo "<tr><td align=\"center\"><font color=\"green\">Physikalischer RAM </font></td></tr>";
echo "<tr><td align=\"center\">$total" , $results['ram']['total'] , "$kb </td></tr>" ;
echo "<tr><td align=\"center\">$free" , $results['ram']['free'] , "$kb </td></tr>";
echo "<tr><td align=\"center\">$cache" , $results['ram']['cached'] , "$kb </td></tr>" ;
echo "<tr><td align=\"center\">$buffer" , $results['ram']['buffers'] , "$kb </td></tr><br>";
echo "<tr><td></td></tr>";
echo "<tr><td align=\"center\"><font color=\"green\">SWAP </font></td></tr>";
echo "<tr><td align=\"center\">$swaptotal" , $results['swap']['total'] , "$kb </td></tr>";
echo "<tr><td align=\"center\">$swapfree" , $results['swap']['free'] , "$kb</td></tr></table>";
echo "<script>function load() {window.self.location=\"start.php\"}</script><script>JSCTimeOutID = window.setTimeout('load()',3000)</script>
<br><hr><br><br><br><br><br><br><br><br><br><br><br><br><br><hr><center>
<br>
<center>Vom Webinterface <a href=\"logout.php\">abmelden</a></center>
<a href=\"mailto:netflat@hotmail.com?subject=Webinterface-1.3\" title=\"mail\">zyrusthc</a>&nbsp;&nbsp;<a href=\"http://zyrusthc.homeip.net\">http://zyrust...gt;";
?>


Nun habe ich oberhalb des Links zu dieser Website die Möglichkeit geschaffen, mich vom Webinterface abzumelden. Auch das funktioniert.... nicht ganz....

Nun zu meinem Problem:
Anmelden? Geht!
Im WI arbeiten? Geht!
Abmelden? Geht... nicht :-(

Wenn ich auf Abmelden drücke, wird nur der rechte Frame aktualisiert/gelöscht, und mir wird an der Stelle wieder das Anmeldeformular angezeigt. Der rechte Frame, mit den Buttons zu den Gameservern wird nicht entfernt, sodas man mit einem klick auf die Buttons noch immer an die Server ran kommt.

Also...
Wo an welcher Stellle muß ich das "logout.php" in welcher Datei angeben, damit beide Frames entfernt, und nur noch das leere Anmeldeformular zu sehen ist?!?!
Ich hab da gestern 4 Stunden dran gesessen....

Meine Nice-2-Have:
1)
Die Möglichkeit das Loginformular noch mit einer anderen Hintergrundfarbe und/oder Bild zu bestücken, statt nur den langweiligen weissen Hintergrund zu "bewundern"

Vielleicht so ähnlich wie du das in der "header.php" gemacht hast?

2)
Eine kleine Server-Alive Anzeige... vielelicht eine grün Blinkende *.gif, wenn der Server "onAir" ist und ne rote falls nicht?

Ich kann PHP-Code einigermaßen lesen und verstehen was an vielen Stellen (nicht an allen) mit dem Code bewirkt wird, aber dafür habe ich keine Lösung gefunden.

Wäre schön, wenn du dafür ne Lösung hättest. Vielleicht kannst du das ja sogar in künftige Releases integrieren?!

Danke & Gruß
Daniel


Dieser Beitrag wurde 1 mal editiert, zuletzt von Deichgraf am 15.03.2008 - 16:06.
Beitrag vom 15.03.2008 - 11:44
Diesen Beitrag melden   nach weiteren Posts von Deichgraf suchen Deichgraf`s Profil ansehen Deichgraf eine E-Mail senden Deichgraf eine private Nachricht senden Deichgraf zu Ihren Freunden hinzufügen zum Anfang der Seite
Boardstruktur - Signaturen verstecken
vorheriges Thema   nächstes Thema

Beiträge Autor Datum
Themenicon  Wie füge ich dem WI ein PHP gestütztes LogIn hinzu?
Deichgraf 15.03.2008 - 11:44
 Wie füge ich dem WI ein PHP gestütztes LogIn hinzu?
Deichgraf 16.03.2008 - 19:17
Themenicon  Mal leise nachfrag...
Deichgraf 24.03.2008 - 18:29
 Wie füge ich dem WI ein PHP gestütztes LogIn hinzu?
zisu 25.03.2008 - 07:49

Gehe zu:  
Es ist / sind gerade 0 registrierte(r) Benutzer und 35 Gäste online. Neuester Benutzer: Scarez
Mit 3855 Besuchern waren am 02.09.2011 - 13:07 die meisten Besucher gleichzeitig online.
Aktive Themen der letzten 24 Stunden | Foren-Topuser
 
Seite in 0.46483 Sekunden generiert


Diese Website wurde mit PHPKIT WCMS erstellt
PHPKIT ist eine eingetragene Marke der mxbyte GbR © 2002-2009