Login Script
Arne Kemen
- php
Hallo,
ich habe diese Registierung geschrieben. Wie kann ich jetzt draus einen Login Forumlieren, also wo er in der Datenbank abfragt ob es den USer gibt.
<?php function check_email($email) {
//author: Christian Kruse, CK1@wwwtech.de
//Quelle: http://selfaktuell.teamone.de/tippstricks/programmiertechnik/email/index.html
// RegEx begin
$nonascii = "\x80-\xff"; # Non-ASCII-Chars are not allowed
$nqtext = "[^\\$nonascii\015\012"]";
$qchar = "\\[^$nonascii]";
$protocol = '(?:mailto:)';
$normuser = '[a-zA-Z0-9][a-zA-Z0-9_.-]*';
$quotedstring = ""(?:$nqtext|$qchar)+"";
$user_part = "(?:$normuser|$quotedstring)";
$dom_mainpart = '[a-zA-Z0-9][a-zA-Z0-9._-]*\.';
$dom_subpart = '(?:[a-zA-Z0-9][a-zA-Z0-9._-]*\.)*';
$dom_tldpart = '[a-zA-Z]{2,5}';
$domain_part = "$dom_subpart$dom_mainpart$dom_tldpart";
$regex = "$protocol?$user_part@$domain_part";
// RegEx end
return preg_match("/^$regex$/",$email);
}
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<link rel="stylesheet" type="text/css" href="css.css">
<title>Ghost Soldier</title>
</head>
<body>
<?php
if ($_POST["schritt"] == "zwei") {
$fehler = array();
$username = $_POST["username"];
$officier = $_POST["officier"];
$password = $_POST["password"];
$passwordw = $_POST["passwordw"];
$email = $_POST["email"];
//Test ob die Passwort Widhl. mit dem Passwort uebereinstimmt
if($passwordw != $password) $fehler[]= "Die Passwort Widhl. muss mit dem Passwort übereinstimmen.";
//Testen der EMailAdresse
if(!check_email($email)) $fehler[] = "Bitte eine richtige E-Mail Adresse eingeben.";
//Ueberprüen des Passworts auf zulaesige Zeichen
if (!preg_match("/[1]*$/", $password)) $fehler[]= "Das Passwort darf nur aus Buchstaben, Zahlen und _ - bestehen!";
//Testet den Usernamen auf zulaesige Zeichen
if (!preg_match("/[2]*$/", $username)) $fehler[]= "Der Benutzernamen darf nur aus Buchstaben, Zahlen und _ - bestehen!";
//Testet den Usernamen auf zulaesige Zeichen
if (!preg_match("/[3]*$/", $officier)) $fehler[]= "Der Officiername darf nur aus Buchstaben, Zahlen und _ - bestehen!";
if (count($fehler) == 0) {
$dbName = "***";
$dbHost = "***";
$dbUser = "***";
$dbPW = "";
if (!(($dblink = mysql_connect($dbHost,$dbUser,$dbPW)) && (mysql_select_db($dbName,$dblink)))) die(mysql_error());
$datum = time();
//echo $datum." as ".strlen($datum);
mysql_query("INSERT INTO register VALUES('','$username','$officier','$password','$email','');") or die(mysql_error());
echo "<html>";
echo "<head>";
echo "<link rel="stylesheet" type="text/css" href="css.css">";
echo "<title>Ghost Soldier</title>";
echo "<meta http-equiv="refresh" content="5; URL=index.php">";
echo "</head>";
echo "<body>";
echo "<h3>Sie haben sich erfolgreich registriert, aktivieren Sie ihren Account über den Link in ihrer EMail</h3><br><br>";
echo "<h3>Sie werden sofort weitergeleitet</h3><br><br>";
echo "<h3>Wenn Sie nicht weitergeleitet werden klicken sie <a href="index.php">hier</a></h3>";
echo "</body>";
echo "</html>";
exit();
}
echo "Fehler bei Folgenden Punkten:<ul>";
for ($i = 0; $i < count($fehler); $i++) echo "<li>".$fehler[$i];{
}
echo "</ul>";
}
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<p align="center"><span style="font-size:20pt;font-family:Tahoma;">Registieren bei Ghost Soldiers</span></p>
<p align="center">Wenn sie Hilfe benötigen klicken Sie einfach auf eine Feldbezeichnung, z.B. klicken Sie einfach auf Username schon erscheint die Erklärung für diese Eingabe.</p>
<p align="center">
<table class="einfach">
<tr>
<td>
<table>
<img src="images/bg.gif">
</table>
</td>
</tr>
<tr>
<td>
<center>
<table class="main">
<tr>
<td style="width:200;cursor:help" onClick="alert('Der gewählte Username darf höchsten 12 Zeichen lang sein.Es dürfen keine Sonderzeichen gewählt werden. Der gewählte Username kann nach der Anmeldung nicht geändert weren!');"><p align="center">Username</p></td>
<td><p align="center"><input type="text" name="username" class="login" style="width:50%"></p></td>
</tr>
<tr>
<td style="width:200;cursor:help" onClick="alert('Der gewählte Officier darf höchsten 12 Zeichen lang sein.Es dürfen keine Sonderzeichen gewählt werden. Der gewählte Officier Name kann nach der Anmeldung nicht geändert weren!');"><p align="center">Name ihres Officiers</p></td>
<td><p align="center"><input type="text" name="officier" class="login" style="width:50%"></p></td>
</tr>
<tr>
<td style="width:200;cursor:help" onClick="alert('Das Passwort darf höchstens 12 Zeichen haben, auch hier dürfen keine Sonderzeichen gewählt werden.');"><p align="center">Passwort</p></td>
<td><p align="center"><input type="password" name="password" class="login" style="width:50%"></p></td>
</tr>
<tr>
<td style="width:200;cursor:help" onClick="alert('Die Passwort Widhl. muss mit dem Passwort übereinstimmen!');"><p align="center">Passwort Widhl.</p></td>
<td><p align="center"><input type="password" name="passwordw" class="login" style="width:50%"></p></td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td style="width:200;cursor:help" onClick="alert('Bitte geben Sie ihre vollständige EMailadresse an!');"><p align="center">EMail</p></td>
<td><p align="center"><input type="text" name="email" class="login" style="width:50%"></p></td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td><p align="center"><input type="submit" value="Registieren" class="login" style="width:50%"></p></td>
<input type="hidden" name="schritt" value="zwei" class="login">
</tr>
<tr>
</tr>
</table>
</center>
</td>
</tr>
</table>
</p>
</center>
</body>
</html>
Hallo,
weniger ist manchmal mehr....
SELECT * FROM tabelle WHERE username LIKE '$username' LIMIT 1;
if($username == $row->username AND $passwort == $row->passwort)
{
//Eingelogt
}
MFG
Andavos
hi,
weniger ist manchmal mehr....
noch weniger kann noch mehr sein:
SELECT * FROM tabelle WHERE username LIKE '$username' LIMIT 1;
if($username == $row->username AND $passwort == $row->passwort)
{
//Eingelogt
}
warum nicht in der WHERE-klausel der SELECT-bedingung gleich auch username _und_ passwort abprüfen?
dann braucht man nachher in PHP nur noch prüfen, ob eine ergebniszeile zurückgeliefert wurde, oder nicht.
gruß,
wahsaga
Hallo,
dies wäre möglich, allerdings benutze ich lieber die IF Anweisung:
SELECT * FROM tabelle WHERE username = '$username' AND pw = '$pw';
Weil man username = '$username' schreibt, wird auch zwischen Groß- und Kleinschreibung unterschieden, was ich nicht so schön finde, denn oft weiß ich nicht, ob ich jetzt den Namen Groß- oder Kleingeschrieben habe.
Benutzt man LIKE würde ein weiteres Problem auftreten:
SELECT * FROM tabelle WHERE username LIKE '%' AND pw ='geheim';
Als Username wurde ein % angegeben, und somit wird nur noch das PW überprüft => wenn jmd. das PW benutzt wird mal als dieser eingelogt.
Desweiteren ist diese Abfrage anfälliger gegenüber SQL Injection:
SELECT * FROM tabelle WHERE username LIKE 'andavos';' AND pw ='geheim';
Also Username wurde: andavos'; angegeben. Und da dieser Eintrag in der DB vorhanden ist, werde ich als andavos (oder als Admin) eingelogt.
Das gleiche könnte auch bei pw sein.
Wenn ich eine IF-Anweisung die Daten überprüfen lasse, funktioniert dieser Weg nicht mehr, denn der PW + Username wird dort nocheinmal extra überprüft.
Auch wenn man sich gegen SQL Injection etc. schützt, so finde ich diese Variante einfach sicherer und auch komfortabler.
P.S. Die meisten Anfänger wissen nicht was eine SQL Injection ist, und falls der Schutzt (magic_quotes) auf Off steht, kann man so ganz leicht den Login umgehen.
MFG
Andavos
hi,
dies wäre möglich, allerdings benutze ich lieber die IF Anweisung:
SELECT * FROM tabelle WHERE username = '$username' AND pw = '$pw';Weil man username = '$username' schreibt, wird auch zwischen Groß- und Kleinschreibung unterschieden, was ich nicht so schön finde, denn oft weiß ich nicht, ob ich jetzt den Namen Groß- oder Kleingeschrieben habe.
ob zwischen groß- und kleinschreibung unterschieden wird, hängt vom spaltentyp ab (und natürlich auch vom DB-system).
mysql unterscheidet bei seinen texttypen bei solchen vergleichen aber per default _nicht_ nach groß- und kleinschreibung.
Benutzt man LIKE würde ein weiteres Problem auftreten:
SELECT * FROM tabelle WHERE username LIKE '%' AND pw ='geheim';Als Username wurde ein % angegeben, und somit wird nur noch das PW überprüft => wenn jmd. das PW benutzt wird mal als dieser eingelogt.
von so einem unfug redet ja auch niemand :-)
Desweiteren ist diese Abfrage anfälliger gegenüber SQL Injection:
SELECT * FROM tabelle WHERE username LIKE 'andavos';' AND pw ='geheim';Also Username wurde: andavos'; angegeben. Und da dieser Eintrag in der DB vorhanden ist, werde ich als andavos (oder als Admin) eingelogt.
das passiert nur, wenn der programmierer - du - geschlampt hat.
diese _art_ der anfrage ist kein bisschen anfälliger als jede andere auch.
das sonderzeichen ' nicht zu entschärfen, _bevor_ es in die query eingesetzt wird, ist aber ein riesengroßer fehler des programmierers.
Auch wenn man sich gegen SQL Injection etc. schützt, so finde ich diese Variante einfach sicherer und auch komfortabler.
ich nicht.
P.S. Die meisten Anfänger wissen nicht was eine SQL Injection ist, und falls der Schutzt (magic_quotes) auf Off steht, kann man so ganz leicht den Login umgehen.
magic_quotes _ist_ nicht "der schutz" vor SQL injections.
gruß,
wahsaga
Hallo,
über dieses Thema kann man Stundenlang diskutieren, aber ich habe folgende Erfahrung gemacht:
Nur wenige PHP Programmierer, die teilweise auch Geld damit verdienen, sind sich der Gefahr von SQL Injections bewusst, denn (dank) magic_quotes werden diese ja entschärft, und weil es die Default Einstellung ist, haben Programmierer lokal keine Probleme, wenn mal ein ' in die Eingabe gerrät, weil es ja maskiert wird, sonst erhielten die Programmierer eine Warnung oder ähnliches.
In so gut wie jeder Einführung die ich bisher gelesen habe, wird darauf hin nicht hingewiesen, meistens nur in Literatur für PHP Profis, und die meisten, die eine Einführung durchgelesen haben, denken sie seien Fit und den Rest würden sie "auf der Straße" lernen.
Was ja auch teilweise stimmt, zwar schlägt man sich nach einem halben Jahr die Hände über dem Kopf zusammen, wenn man sich anschaut was man dort Programmiert hat, aber es funktioniert! Und dies ist den meistens das wichtigste.
Nur wenige Spezies, denen nicht unbedingt das Ziel, sondern der Weg wichtiger ist, die werden sich evt. ein PHP Profi Buch kaufen.
Darum empfehle ich lieber die IF Anweisung, außerdem ist dadurch der SQL String/Befehl kleiner und die IF Anweisung kann man, leichter Editieren, sofern man sich noch nicht stark mit SQL auseinandergesetzt hat.
So kann man auch z.B. noch einen Sicherheitscode oder ähnliches überprüfen lassen. Denn jmd. der Angreift, soll ja nicht wissen ob Sicherheitscode, Username oder PW falsch war.
Außerdem kann es passieren, dass jmd. anstatt dem sicherem: spalte = 'wert' evt. LIKE benutzt: spalte LIKE 'wert'
Und wenn dann jmd. Username: % und PW: % eingibt, und beides per LIKE überprüft wird, dann wird man eingelogt, weil beide Aussagen ja zutreffen.
Also für erfahrene PHP Programmierer, die sich mit Sicherheit (von Scripts) auskennen, können gerne das Login als SQL Anweisung schreiben, allerdings werden diese kaum nach einem Loginscript fragen.
Für Anfänger würde ich aber die IF Konstruktion empfehlen.
Zum Thema Groß- und Kleinschreibung:
Da hab ich mich versehen und muss dir recht geben.
MFG
Andavos