Das "perfekte Layout" ist Ansichtsache.
Mir gefallen bspw. weiße Seiten mir reinen schwaren Text (Schriftgröße -4, Verdana, Arial, Helvetica, sans-serif), aber damit stehe ich wohl alleine da.
Bilder kannst du zeichnen oder klauen, aber achte auf eventuelle Copyrights.
Nun zum Loginscript:
Du schaust einfach ob ein Eintrag mit dem Namen Benno und den Passwort was eingetipp wurde existiert.
Ich versuche es dir mal zu erklären. Es wird davon ausgegangen das die Tabelle script_user Mit den Inhalt ID (Integer, auto_inc, Primär), Name (Varchar, 20), Passwort (Varchar, 32), Session (Varchar, 255) und IP, (Varchar, 15) existiert.
In Namen steht Benno, in Passwort das Passwort als md5-Chechsum (z. B. e798a07fb0f47a16df0c16c823085210 für PlanetCoding, darüber unten mehr, CaseSensitiv), ID wird sowieso automatisch vergeben und Session/IP kann leer bleiben, der Inhalt wird wärend dem Login abgeändert.
Zuerst brauchen wir natürlich ein Formular:
| code: |
1:
2:
3:
4:
5:
|
<form method="post">
<input type="text" name="Name"><br>
<input type="password" name="Pass"><br>
<input type="submit" name="Submit">
</form> |
|
Das ist wohl klar, der Browser zeichnet 2 Textboxen und einen Submit.
Der Form-Tag fasst die 3 Objekte zusammen, und legt die Methode (post) und die Zielseite fest. Da das Attribut "action=""" nicht gesetzt ist, wird die momentane Seite
genommen. Das bedeutet, dass wenn der Submit gedrückt wird der Browser sich selbst zur Zielseite weiterleitet und die Daten per POST sendet.
POST bedeutet, dass die Daten versteckt gesendet werden, anderst als bei GET, wo sowas wie "?threadid=2534" in der Addressleiste steht. Dafür ist POST nicht so einfach verwendbar, sollte aber bei Login plicht sein, da man ja sonst das Passwort in der Addressleiste hat. ^^
Allerdings hat GET eine Begrenzung von 255 Zeichen - (Protokoll+Websiteurl+Variablenamenlänge+Anzahl Variablen * 2)
Mit einem Wort: Die Adressleiste kann nur 255 Zeichen (= 1 Byte) enthalten, damit es gültig bleibt. Ist wohl ein Schutz vor Buffer Overflow oder so.
Gut, weiter gehts. Nun kommt PHP ins Spiel.
Wir müssen jetzt natürlich prüfen, ob der Submit gedrückt wurde. Der Submit enthält zwar kein Value, wird aber trotzdem gesendet. Zusammen mit der Funktion "isset" machen wir uns das zu nutze:
| php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
|
if(!isset($HTTP_POST_VARS['Submit']))
{
?>
<form method="post">
<input type="text" name="Name"><br>
<input type="password" name="Pass"><br>
<input type="submit" name="Submit">
</form>
<?
}
else
{
} |
|
Isset gibt einen Booleanischen Wert zurück, je nachdem ob die Variable gesetzt wurde.
Das IF überprüft das. Normalerweiße würde die Form nur angezeigt werden wenn die Variable gesetzt wurde. Das Rufzeichnen nach der IF dreht das ganze aber um. d. H. wenn du noch nicht gedrückt hast wird sie angezeigt.
Wenn du es jetzt so ausführst wird vermutlich einfach die Form "verschwinden", da er beim 2. mal die leere else ababreitet, da isset ja true ist.
Statt $HTTP_POST_VARS kannst du auch $_POST verwenden. Ich habe mir es aber so angewöhnt, du kannst es ja machen wie du willst.
Jetzt müssen wir aber natürlich die restlichen POST-Variablen die im Nirvana rumfliegen einfangen und in PHP-Variablen stopfen. Ist zwar nicht nötig, aber ich finde es so gemütlicher einen kurzen Variablennamen als das ganze POST-Ding zu schreiben.
| php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
|
if(!isset($HTTP_POST_VARS['Submit']))
{
?>
<form method="post">
<input type="text" name="Name"><br>
<input type="password" name="Pass"><br>
<input type="submit" name="Submit">
</form>
<?
}
else
{
$name = $HTTP_POST_VARS['Name'];
$pass = $HTTP_POST_VARS['Pass'];
} |
|
Soda, das ist alles. Damit steht der Inhalt jeweils in seiner Variable. Du könntest darunter z. B. echo $name; schreiben, und könntest so die Variablen wieder ausgeben. (echo $HTTP_POST_VARS['Name']; würde auch gehen, aber wie gesagt...)
Jetzt müssen wir natürlich prüfen ob der User auch tatsächlich die richtigen Daten angegeben hat:
| php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
|
if(!isset($HTTP_POST_VARS['Submit']))
{
?>
<form method="post">
<input type="text" name="Name"><br>
<input type="password" name="Pass"><br>
<input type="submit" name="Submit">
</form>
<?
}
else
{
$name = $HTTP_POST_VARS['Name'];
$pass = $HTTP_POST_VARS['Pass'];
$pass = md5($pass);
$sql = mysql_query("SELECT ID FROM script_user WHERE Name = '$name' AND Passwort ='$pass' LIMIT 1");
if(mysql_num_rows($sql) == 1)
{
//Hier wird später weiter ausgebaut
}
else
{
echo "<div align=\"center\">Benutzername/Passwortkombination leider falsch. ._.\"</div>";
}
} |
|
Also, zuerst wird nun das Passwort per md5() zu einer md5-Checksum gemacht. Bedeutet im klarren das es praktisch "unleserlich" gemacht wird. Die Checksums haben ein Hexadezimales Charset und immer 32 Zeichen. Damit sind sie zwar natürlich niemals einzigartig da es ja beliebig viele Plain-Kombos geben kann, aber Koolisationen sind ziemlich selten.
Dann speichert er die mysql_query in eine Variable SELECT bedeutet das ein Datensatz ausgelesen wird, FROM aus welcher Tabelle. WHERE legt die Bedingungen fest, eben die Daten die drinnenstehen. LIMIT 1 bedeutet das er max. einen Datensatz nimmt. Mehr mit den selben Namen dürfen ja auch nicht auftrehten.
mysql_num_rows schaut wie viele Datensätze er gefunden hat, ist es einer geht es beim Kommentar weiter, sonst wird das echo ausgegeben.
<div ist dabei ein HTML-Tag, align legt die Ausrichtung fest und center sagt ihm das zentriert wird.
Wenn nun tatsächlich Daten stimmen, muss eingeloggt werden. Ich mache immer das jedem User eine 1 Byte-lange ID zugewiesen wird, und zudem noch die IP als vergleich gespeichert wird.
Also:
| php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
|
if(!isset($HTTP_POST_VARS['Submit']))
{
?>
<form method="post">
<input type="text" name="Name"><br>
<input type="password" name="Pass"><br>
<input type="submit" name="Submit">
</form>
<?
}
else
{
$name = $HTTP_POST_VARS['Name'];
$pass = $HTTP_POST_VARS['Pass'];
$pass = md5($pass);
$sql = mysql_query("SELECT ID FROM script_user WHERE Name = '$name' AND Passwort ='$pass' LIMIT 1");
if(mysql_num_rows($sql) == 1)
{
for($i = 0;$i<255;$i++)
{
mt_srand();
$zufall = mt_rand(65, 90);
$session.=chr($zufall);
}
$ip = $_SERVER['REMOTE_ADDR'];
mysql_query("UPDATE script_user SET Session = '$session' LIMIT 1");
mysql_query("UPDATE script_user SET IP = '$ip' LIMIT 1");
setcookie("TheScr1pt", $session, date("U") + 3600);
echo "<div align=\"center\">Erfolgreich eingeloggt.<br><a href=\"index.php\">Hier gehts weiter</a></div>";
}
else
{
echo "<div align=\"center\">Benutzername/Passwortkombination leider falsch. ._.\"</div>";
}
} |
|
So, weiter gehts: Zuerst wird wenn jetzt eingeloggt wird eine for gestartet. Das ist eine Simple Schleife mit 3 Parameter: Startanweisung ($i = 0): Wird bei beginn ausgeführt, Durchlaufbedingung ($i<255): Solange es true ist wird die Schleife ausgeführt, und zu guter letzt Durchlaufanweißung ($i++): Was passiert wenn durchgelaufen wird. Erster und letzterer Parameter sind optimal.
Danach wird jedes mal mt_srand(); ausgeführt. Bekanntlich gibt es keine Zufälle, also muss es Daten geben wo die Zufallszahlen heraus generiert werden. z. B. dem TimeStamp. Das übernimmt die Funktion.
Danach kommt mt_rand(65, 90);. Das generiert eine Zufallszahl zwischen 64 und 91 und speichert sie am Ende in die Variable. Dann noch chr($zufall); Das wandelt den ANSI-Code in das dazugehöriges ANSI-Zeichen um und fügt es am Ende der Variable $session dazu. (.=) Das macht er jetzt so lange bis $i größer oder gleich 255 ist.
Danach fragt er die Servervariable REMOTE_ADDR ab und speichert sie in die Variable $ip. Diese enthält logischerweiße immer die IP mit der der Zugriff erfolgt ist.
Diese Daten werden dann mit den alten in der DB ersetzt. Sollte wenn du dir die SELECT oben anschaust selbsterklärent sein.
Dann wird ein Cookie gesetzt. Der erste Parameter legt den Namen fest, der 2. den Inhalt. Der 3. ist optimal und legt die Lifetime fest. Ist er nicht angegeben lebt das Cookielein bis der Browser geschlossen wird, dann mampft ers.
Hier nehme ich den Timestamp (date("U")) und addiere 3600 Sekunden, was ganz grob geschätzt einer Stunde entspricht.
Wichtig hierbei ist das der Cookie-Befehl nur im Header an den Browser gesendet werden kann. Der Header ist das erste was gesendet wird, und deshalb darf keine Textausgabe vor dem Befehl erfolgen.
Als letztes wird ein Link zur Startseite geschrieben und der User ist nach allen Regeln der Kunst eingeloggt.
Als letztes noch eine Seite die prüft ob du eingeloggt bist:
| php: |
1:
2:
3:
|
<?php $session = $_COOKIE['TheScr1pt'];
if(mysql_num_rows(mysql_query("SELECT ID FROM script_user WHERE Session = '$session' AND IP = '$ip'")) == 0) { die(); }
echo "Eingeloggt"; ?> |
|
Das sollte mit deinem jetzigen Wissen kein Problem darstellen.
Ich hoffe ich habe das jetzt möglichst Bugfrei und klar hinbekommen. Viel Glück noch.
€: Ups, sorry, daran habe ich jetzt nicht gedacht. Bin mal mitn Tabulator durchgegangen.