Anzeige
Tutorialbeschreibung

Login, Logout, Registrieren, Sessions

Login, Logout, Registrieren, Sessions

Oft sieht man im Forum, dass das Registrieren, das Login und die dazugehörenden Sessions Probleme machen. Wie immer habe ich mich entschlossen, in diesem Tutorial etwas an die Hand zu geben, das nicht nur theoretische Einblicke verschafft, sondern sofort praktisch anwendbar ist; mit anderen Worten: es sind hier alle PHP-Snippets vorhanden, um eine Tabelle (Mysql) anzulegen, dort zu registrieren, dort einzuloggen (bzw. alle gewollten Seiten zu schützen) und auch wieder ordnungsgemäß (per Klick) auszuloggen.


<? include ‘connect.php’;
$sql = "CREATE TABLE `login`(
`ID` INT AUTO_INCREMENT PRIMARY KEY,
`user` varchar(25) NOT NULL default '',
`email` varchar(25) NOT NULL default '',
`password` varchar(25) NOT NULL default '');";
if(mysql_query($sql))
{
echo("Die Tabelle login wurde erstellt </b>");
}
else
{
echo("Konnte die Tabelle login nicht anlegen. Grund: ".mysql_error()." ");
}
?>
Der Vollständigkeit halber, auch noch die (oben includierte) connect.php:
<?php
$mysqlhost = "localhost"; //Servername
$mysqluser = "webxxxxx"; // Benutzername
$mysqlpassword = "xxxxxxxx"; // Passwort
$mysqldb = " xxxxxxxx "; // Datenbankname
$con= @mysql_connect($mysqlhost,$mysqluser,$mysqlpassword);
$mysqldb1 = @mysql_select_db($mysqldb,$con);
?>
Interessant und aufschlussreich ist in der install.php nur die Zeile
<?...{
…… Grund: ".mysql_error()." ");
}…?>
Warum?
Ganz einfach: Wenn beim Installieren der Tabellen etwas nicht klappt, sagt der Parser (zumeist) was nicht stimmt. Siehe auch: http://at.php.net/manual/de/function.mysqli-error.php #

Interessant sind auch noch in der connect.php, die ’@’, was bedeuten sie? Nun zunächst sind das ‚üble’ Zeichen, die man eher nicht verwenden sollte, weil sie den Parser ‚ruhig stellen’, d.h.: er gibt mehr keine Fehlermeldungen aus, obwohl das Programm fehlerhaft ist! … das will man normalerweise nicht, weil jede Fehlermeldung auch informiert! Es gibt aber bei einem Programm Situationen, da wird das Programm zwar ausgeführt, es kommt aber ein (erwartbarer) Fehler, der zwar – im nächsten Schritt des Programms – nicht mehr kommen würde, aber vorerst die Optik stört, nur dann sollte man ‚@’ verwenden!

Soweit so klar, jetzt benötigen wir ein Script, das sowohl REGISTRIEREN (Neuuser) und EINLOGGEN (bereits registrierte User) lässt!

Dieses Script fassen wir in eine *.php zusammen und nennen sie index.php:
<?

# Hier ggf. den Header einfügen!

if ($anmelden) { anmelden($fertig, $user, $password1, $password2, $email);}
else if ($abmelden) { abmelden($fertig, $user, $password);}
else if ($forgot) { forgot($fertig, $email);}
else
{ login($fertig, $user, $password);}
# hier ggf. den Footer einfügen!

?>

<?

function inhalt($user)
{
session_start();
session_register("user");

##################################

#Bauen Sie hier Ihren Inhalt ein!#

?>

<b>Geschützter Inhalt!</b>

<?
}
?>

<?
function login($fertig, $user, $password)
{
include("connect.php");

if ($fertig) {
$abfrage = mysql_query ("SELECT * FROM login WHERE user = '$user'");
$reihen = mysql_num_rows($abfrage);

if ($reihen <= 0) {
echo "Unbekannter Benutzername!";
}

else {
while ($row = mysql_fetch_object ($abfrage)) {
if ($row->password==$password) {
inhalt($user);
}

else {
echo "Falsches Passwort!";
}
}

}

}
else {


echo 'Zum anmelden geht es <a href="'.$PHP_SELF.'?anmelden=yes">hier</a> lang!';
echo '<p><a href="'.$PHP_SELF.'?forgot=yes">Passwort vergessen?</a><br><a href="$PHP_SELF?abmelden=yes">Abmelden</a></p>';
echo '<form method="POST" action="'.$PHP_SELF.'?anmelden=yes&fertig=yes">';



?>
<table cellspacing="1" cellpadding="2" border="0">
<tr>
<td><font size="2">Benutzername:</font></td>
<td><font size="2"><input type="text" name="user" value="">&nbsp;</font></td>
</tr>
<tr>
<td><font size="2">Passwort:</font></td>
<td><font size="2"><input type="password" name="password" value=""></font></td>
</tr>
<tr>
<td colspan=2 align=center><input type=submit value=Login></td>
</tr>
</table>
</form>

<?
echo '<p><a href="'.$PHP_SELF.'?forgot=yes">Passwort vergessen?</a><br><a href="$PHP_SELF?abmelden=yes">Abmelden</a></p>';
}
}

?>

<?
function anmelden ($fertig, $user, $password1, $password2, $email)
{
include("connect.php");
if($fertig) {
$abfrage1 = mysql_query("SELECT user FROM login");
while ($row = mysql_fetch_object ($abfrage1)) {

if ($row->user==$user) {
echo "Dieser Benutzer existiert schon!";
exit;
}

}

if ($user=="" OR $password1=="" OR $password2=="" or $email=="") {
echo "Sie haben mindestens ein Feld nicht ausgefüllt!";
}

else if ($password1!=$password2) {
echo "Ihr Passwort ist ungleich Ihrer Wiederholung!";
}

else {
$anfuegen=mysql_query("INSERT INTO login (user, password, email) VALUES ('$user','$password1', '$email')");

echo "Erfolgreich angemeldet! Sie können sich nun einloggen:<br>";
@login();
}

}

else {
echo "<h2>Anmelden</h2>";
echo '<form method="POST" action="'.$PHP_SELF.'?anmelden=yes&fertig=yes">';
?>

<table cellspacing="1" cellpadding="2" border="0">
<tr>
<td><font size="2">Benutzername:</font></td>
<td><font size="2"><input type="text" name="user" value="">&nbsp;</font></td>
</tr>
<tr>
<td><font size="2">Passwort:</font></td>
<td><font size="2"><input type="password" name="password1" value=""></font></td>
</tr>
<tr>
<td><font size="2">Wiederholen:</font></td>
<td><font size="2"><input type="password" name="password2" value=""></font></td>
</tr>
<tr>
<td><font size="2">E-Mail:</font></td>
<td><font size="2"><input type="text" name="email" value="">&nbsp;</font></td>
</tr>
<tr>
<td colspan=2 align=center><input type=submit value=Anmelden></td>
</tr>
</table>
</form>

<?
}

}

?>

<?

function forgot ($fertig, $email)
{
include("connect.php");

if ($fertig) {
$abfrage=mysql_query("SELECT * FROM login");
while ($row = mysql_fetch_object ($abfrage)) {
if ($email==$row->email) { $ismail="true"; }
}

if ($ismail=="true") {
$password=mysql_query("SELECT * FROM login WHERE email = '$email'");
while ($row = mysql_fetch_object ($password)) {

$nachricht="Hallo $row->user!nnIhr Passwort ist:nn$row->passwordnnMfGnAdmin";
}

mail($email, "Passwort", $nachricht, "From: Administrator");

?>

<p>Das Passwort wurde Ihnen erfolgreich an die Adresse <i><? echo $email; ?></i> geschickt!<br>
Rufen Sie Ihre E-Mails ab und loggen Sie sich ein.<br></p>

<?
@login();
}

else { echo "Ihre angegebene E-Mail Adresse wurde nicht gefunden!";}
}

else {
echo "<p><h2>Passwort vergessen</h2><p>";
echo '<p><form method=post action="'.$PHP_SELF.'?forgot=yes&fertig=yes">';

?>

<table cellspacing="1" cellpadding="2" border="0">
<tr><td><font size="2">E-Mail Adresse:</font></td><td align=center><input type=text name=email></td></tr>
<tr><td colspan="2" align=center><input type=submit value="Schicken!"></td></tr>
</table></form></p>

<?
}

}

?>

<?

function abmelden($fertig, $user, $password)
{
include ("connect.php");
if($fertig) {
$abfrage = mysql_query ("SELECT * FROM login WHERE user = '$user'");
$reihen = mysql_num_rows($abfrage);

if ($reihen <= 0) {
echo "Unbekannter Benutzername!";
}

else {
while ($row = mysql_fetch_object ($abfrage)) {
if ($row->password==$password) {
$delete = mysql_query ("DELETE FROM login WHERE user = '$user'");
echo "Ihre Daten wurden erfolgreich aus der Datenbank entfernt!";
}

else {
echo "Falsches Passwort!";
}
}
}

}

else {
echo "<p><h2>Abmelden</h2></p>";
echo '<form method="POST" action="'.$PHP_SELF.'?abmelden=yes&fertig=yes">';
?>

<table cellspacing="1" cellpadding="2" border="0">
<tr>
<td><font size="2">Benutzername:</font></td>
<td><font size="2"><input type="text" name="user" value="">&nbsp;</font></td>
</tr>
<tr>
<td><font size="2">Passwort:</font></td>
<td><font size="2"><input type="password" name="password" value=""></font></td>
</tr>
<tr>
<td colspan=2 align=center><input type=submit value=Abmelden></td>
</tr>
</table>
</form>

<?
}

}

?>
Nun es wäre unübersichtlich und würde den Rahmen dieses Tutorials sprengen oben jede Zeile zu erklären.
Nur soviel:
1. es wird mit diesem Script eine Session gestartet, die ’user’ heißt; das ist deshalb wichtig zu wissen, weil jede Seite (dazu später), die geschützt werden soll, ein CodeSnippet erhalten muss, das die Session verifiziert.
2. es sind oben mehr <? und ?> vorhanden, als nötig. Dies sollte (im Sinne einer besseren Performance) von Ihnen geändert werden, ist jedoch übersichtlicher, zumal insbesondere html-codes und php-codes abwechseln!
Jetzt kommt das Herzstück einer jeden Login-Session, das Snippet, das Sie am Seitenanfang einer jeden zu schützenden Datei (also im Userbereich) einkopieren:
<?php
session_start();
if (!session_is_registered('user'))
{
die ("Sie müssen sich einloggen!");
}
?>
… oder 1x in eine Datei packen und dann inkludieren (bessere Performance!)

Natürlich sollten Sie auch etwas an der Hand haben (professionelle Seiten haben das klarerweise!), das ordnungsgemäß ausloggt und die erzeugte Session zerstört, damit ihr Weiterlaufen nicht den Server unnötig belastet! … also einen Hyperlink auf logout.php, z.B.:
<a href=“logout.php“ target=“_blank“>Ausloggen</a>
… und die logout.php:
<?session_start();
if (!session_is_registered('user'))
{
die ("Sie müssen sich einloggen!");
}
$_SESSION = array();
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
session_destroy();
echo '<center><br><br><br>Sie haben erfolgreich ausgeloggt!'; ?>

Das war’s, diesmal ein bisschen länger, aber leider nicht anders machbar. Ich hoffe, es hilft.

DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von testuserxc
  • 15.11.2010 - 21:56

Muss mich leider anschließen. Beschreibung ist gut, allerdings veraltet.

Portrait von Flash18ca
  • 05.11.2010 - 23:29

Danke für das tut funkt leider nicht wird aber wohl an mir ligen :P

Portrait von webmastersworld
  • 19.10.2010 - 16:02

@pl1206: bitte sei nicht böse, aber NUR dieses tut ist CODE-VERALTET (alle anderen sind meiner info nach OK :-)), kann daher nicht klappen, ich schreibe mal neues, wenn ich zeit habe. bitte google einfach nach sessions, login, php ... da müsstets fündig werden :-)

lg
webmastersworld

Portrait von pl1206
  • 19.10.2010 - 14:16

Vielen Dank für die Anleitung.

leider funktioniert diese nicht, ich bin Anfänger in PHP.
Muss mal die Vorschläge die in den Antworten enthalten sind durcharbeiten.

Portrait von mastergeiger
  • 21.09.2010 - 15:04

Das tut ist für ein grundgerüst eines loginsystemes eigentlich ganz gut. Es ist natürlich ausbaufähig,was ich auch bei mir gemacht habe ;-)

Portrait von sunriseproject
  • 23.07.2010 - 21:17

Also das Script ist etwas veraltet...
Wer noch keine oder wenige Erfahrungen mit PHP hat, für den wird das Tutorial eher keinen wirklichen Erfolg haben. Zum Code fehlen die Erklärungen...
Vielleicht sollte das Tutorial überarbeitet werden oder entfernt werden, es ist schade um die Punkte..

Portrait von prowebber
  • 20.07.2010 - 22:09

Na ja, viel Code, sehr wenig Erklärung

Portrait von Khazar
  • 26.06.2010 - 11:05

Wenn es nicht mehr geht sollte es gelöscht werden!

Portrait von s04fansite
  • 05.02.2010 - 17:10

Funktioniert SO nicht mehr.

PHP hat sich (glaube ich) seit dem um 4-5 (Sub-)Versionen weiterentwickelt - seit Juli 2006...

Schade.

Bin leider selbst Anfänger und weiß es nicht besser - kann nicht sagen WAS und WARUM es falsch ist...

Aber mal an die "Warum machst Du nicht das Tut mal neu..."-Schreier:
Eben drum: Warum meldet Ihr Euch nicht bei den Betreibern und bittet um Löschung (immerhin werden Punkte für etwas unproduktives abgezogen) und warum, wenn Ihr alle sicherheitsrelevanten Verbesserungen kennt, schreibt Ihr nicht ein neues TUT?
Denn DAMIT wäre mir mehr geholfen als mit 20 Kommentaren, die sagen, dass dieses TUT "Mist" ist und ihr das 100x besser gemacht hättet...

Portrait von ninoco
  • 11.01.2010 - 11:51

Wirklich nicht up-to-date, und bei so einem Script würde ich mich auch nie anmelden, wenn ich schon sehe, dass mein Passwort agr nciht verschlüsselt in die DB geschrieben würde...

Portrait von webmastersworld
  • 11.01.2010 - 12:32

dass das script veraltet ist, ist bekannt und wurde bislang von mir nicht mehr beantwortet :-)

... aber ein wort zur verschlüsselung des pw:

1. pw werden unverschlüsselt in den browser eingegeben UND erst nach übertragung an den server dort verschlüsselt, also wenn auf diesem weg ein sicherheitsloch besteht, müsste man den rechner besser absichern

2. pw im plaintext schaden so lange in der db nicht, so lange niemand das pw des servers kennt, wenn ers allerdings kennt, hilft verschlüsselung auch nicht, weil der hacker jederzeit sein eigenes login reinschreiben kann UND dann wieder deine verschlüsselung eintragen könnte ... du würdest einen angriff (zufälliges entdecken mal abgesehen, während der hacker mit dem neuen login arbeitet) nicht zuordnen können! ... das gilt natürlich auch für betreiber eines dienstes (z.b. gmx, gmail und wie sie alle heissen); auch hier gilt nicht das verschlüsselte pw macht sicher, sondern deine bessere absicherung des db-login.

hacker würden sich für deine fehleinschätzung bedanken, weil dann achtest du einfach bei der sicherheit aufs falsche :-)

... ein beispiel: es hat nicht sehr viel sinn die fenster mit schlössern zu versehen und akriebisch jeden tag zu versperren, aber die wohnungtür unversperrt zu lassen ... tipp: hänge deine defizite nicht so lauthals heraus, indem du dinge behauptest/und als 'GAGA' qualifizierst, an denen man nur erkennt, wie wenig du über sicherheit weisst.

... nicht böse sein, aber auch darüber wollte ich auch mal schreiben, mangels zeit ging dann nicht, dass viele leute erst in dem moment sich selber (wissensdefizite) verraten, wenn sie meinen dies oder jenes beurteilen zu müssen.

wie gesagt für einen hacker ist das eine einladung, es mal bei einem unwissenden wie dir zu versuchen ;-)

Portrait von FredFuchs94
  • 13.12.2009 - 13:54

Nicht wirklich erklärt, einfach nur den Code dahingeklatscht.

Portrait von Logifech
  • 07.11.2009 - 10:22

Sehr Gutes Tut Danke

Portrait von Mainclain
  • 30.09.2009 - 12:22

Hmm ja, gibt es denn keine Möglichkeit hier, es wieder rauszunehmen, wenns veraltet ist *.*?
Ich fand es ein wenig unübersichtig - was bei soetwas langem recht negativ auffällt.

Alternative Portrait

-versteckt-(Autor hat Seite verlassen)

  • 31.08.2009 - 13:24

unbrauchbares skript! Schade um die punkte!

Portrait von SnowDragon
  • 26.08.2009 - 14:57

Script ist zu unübersichtlich und als ich dann noch gelesen hab das es veraltet ist...

Portrait von nos82
  • 05.08.2009 - 22:40

Ich finde es echt scheiße, wenn solche Beiträge veraltet sind und man dafür dann noch Punkte abgezogen bekommt.

Portrait von korsar
  • 24.01.2009 - 14:31

Für die Arbeit die du hier gemacht hast gibt es 2 Punkte nur leider funktionieren die ganzen einselnen Funktionen im Sript nicht zb kann ich mich nicht mal Anmelden. echt schade für die arbeit die ja im ganzen dann doch umsonst war

Portrait von webmastersworld
  • 24.01.2009 - 15:57

leider hast recht, was die funktionen der scripts angeht; das liegt daran, dass das bereits veraltet ist und heutzutage session-login wie damals nicht mehr von servern erkannt werden, ich muss mal neues schreiben, wenn es meine zeit zläßt :-)

sry vorerst :-)

Alternative Portrait

-versteckt-(Autor hat Seite verlassen)

  • 29.11.2008 - 15:05

unübersichtlich... aber hilfreich. danke!

x
×
×