Hi,
ich habe mir mal ein Log-In-Script gesucht und versucht das an die Sachen anzupassen, die ich heute gelernt habe :-))
Hier mal das ganze Script, zu dem ich allerdings schon wieder Fragen habe :-((
<?php
$verbindung = mysql_connect("localhost", "Benutzername" , "Passwort")
if(!isset($verbindung))
{
echo "Leider ist ein Fehler bei der Registrierung aufgetreten.
echo Bitte sende mir zur Registrierung eine E-Mail:
echo <a href="mailto:mail@potionmaster.de">mail@potionmaster.de</a>"
exit;
}
mysql_select_db("homepage")
if(!isset())
{
echo "Leider ist ein Fehler bei der Registrierung aufgetreten.
echo Bitte sende mir zur Registrierung eine E-Mail:
echo <a href="mailto:mail@potionmaster.de">mail@potionmaster.de</a>"
exit;
}
if($_POST["passwort"] != $_POST["passwort2"] OR $_POST["username"] == "" OR $_POST["passwort"] == "")
{
echo "Du musst alle Felder ausfüllen. <a href=\"eintragen.html\">Zurück</a>";
exit;
}
$passwort = md5($_POST["passwort"]);
$result = mysql_query("SELECT id FROM login WHERE username LIKE '" . mysql_real_escape_string($_POST["username"]) . "'");
$menge = mysql_num_rows($result);
if($menge == 0)
{
$eintrag = "INSERT INTO login (username, passwort) VALUES ('" . mysql_real_escape_string($_POST["username"]) . "', '" . mysql_real_escape_string($passwort) . "')";
$eintragen = mysql_query($eintrag);
if($eintragen == true)
{
echo "Hallo <b>$_POST["username"]</b>, Du hast Dich erfolgreich registriert. <a href=\"anmelden.html\">Anmelden</a>";
}
else
{
echo "Registrierung ist fehlgeschlagen.
echo Sollte Deine Registrierung nochmals fehlschlagen, sende mir bitte eine E-Mail:
echo <br>
echo <br>
echo <a href=\"eintragen.html\">Zurück</a>";
}
}
else
{
echo "Der Benutzername ist schon vergeben. Du musst einen anderen wählen.
echo <a href=\"eintragen.html\">Zurück</a>";
}
?>
OK.
Ich sollte die Strings sicherer machen durch "mysql_real_escape_string()" und auch darauf achten, dass ein Script nicht einfach abgebrochen wird, ohne dem Benutzer eine Alternative zu bieten. Das habe ich hier versucht.
1. Frage
if(!isset($verbindung))
{
echo "Leider ist ein Fehler bei der Registrierung aufgetreten.
echo Bitte sende mir zur Registrierung eine E-Mail:
echo <a href="mailto:mail@potionmaster.de">mail@potionmaster.de</a>"
exit;
}
Muss ich hier ein "else" zwingend einfügen oder kann ich das Script einfach weiterlaufen lassen, wenn die Verbindung zur Datenbank geöffnet wurde?
2. Frage
if(!isset(???))
{
echo "Leider ist ein Fehler bei der Registrierung aufgetreten.
echo Bitte sende mir zur Registrierung eine E-Mail:
echo <a href="mailto:mail@potionmaster.de">mail@potionmaster.de</a>"
exit;
}
Mit welchen Wert kann ich den if-Befehl füllen, sollte die Datenbank nicht ausgewählt werden konnte? Kann ich hier überhaupt einen if-Befehl verwenden, oder sollte ich lieber "or die" benützen?
3. Frage
Wenn ich es richtig verstanden habe, muss ich "mysql_real_escape_string()" nur verwenden, wenn ich php-Befehle verwende, die etwas mit SQL zu tun haben, deshalb habe ich den nachfolgenden if-Befehl nur angepasst, was die Variablen angeht.
4. Frage
mysql_real_escape_string() sieht die Platzhalterzeichen % und _ nicht als besondere Zeichen an, die man escapen muss. Diese kommen also unverändert im SQL-String an.
Wenn du jetzt eine Benutzereingabe für eine Wildcard-Suche anwendest, wäre die erste Überlegung:
In SQL: Suche alles, was mit XYZ anfängt - und XYZ ist die Benutzereingabe.
SELECT ... FROM ... WHERE feld LIKE 'XYZ%'
In PHP: Bastel die Benutzereingabe in den String - aber bitte escapen.
$sql = "SELECT ... FROM ... WHERE feld LIKE '".mysql_real_escape_string($searchFor)."%'",
>
> Benutzereingabe lautet: % (der will halt alles suchen, was mit einem Prozentzeichen beginnt.
>
> Resultierendes SQL:
> `SELECT ... FROM ... WHERE feld LIKE '%%'`{:.language-sql}
>
> Wirkung: Es wird nach allem gesucht, was in der Datenbank steht - LIKE '%%' filtert nichts, sondern findet alle Einträge.
>
> Resultat: Es wird nicht nach dem Prozentzeichen gesucht, sondern alles gefunden. Das ist nicht, was der Benutzer wollte.
>
> Korrekt wäre folgender SQL-String gewesen:
> `SELECT ... FROM ... WHERE feld LIKE '\%%'`{:.language-sql}
>
> Das würde nach allem suchen, was mit einem Prozentzeichen anfängt.
>
> Da die MySQL-Extensions in PHP für diesen Sonderfall keine eigene Funktion anbieten, um diese Such-Platzhalter zu escapen, muss man sich das halt selbst bauen.
>
> Die Anwendung von sprintf() an der Stelle ist nur eine Erleichterung für das Zusammensetzen des SQL-Strings. Die Vorlage des Strings steht in einem Rutsch für sich allein, und enthält an den entsprechenden Stellen Platzhalter (%s für "String"). Dahinter kommen die weiteren Parameter von sprintf, die von vorne nach hinten für jeden Platzhalter den einzufügenden Wert enthalten.
>
Mein Code:
~~~php
$passwort = md5($_POST["passwort"]);
$result = mysql_query("SELECT id FROM login WHERE username LIKE '" . mysql_real_escape_string($_POST["username"]) . "'");
$menge = mysql_num_rows($result);
Ist es richtig, dass ich hier kein %-Zeichen eingetragen habe weil ich keinen Platzhalter brauche oder ist das ein Denkfehler und ich brauche das bei LIKE zwingend (den Teil habe ich immer noch nicht kapiert, dabei tüftle ich da schon den ganzen Tag rum!)
5. Frage
$eintrag = "INSERT INTO login (username, passwort) VALUES ('" . mysql_real_escape_string($_POST["username"]) . "', '" . mysql_real_escape_string($passwort) . "')";
$eintragen = mysql_query($eintrag);
In der Beschreibung zum Kontextwechsel standen immer nur Beispiele mit SELECT, aber da es sich hier um einen Befehl bezüglich der Datenbank handelt und Benutzereingaben verwendet werden, habe ich hier das "mysql_real_escape_string()" mit eingefügt.
Ist das so korrekt?
Würde mich freuen, wenn ihr mir ein Feedback geben könntet. Bin auch offen für Änderungen am Script. Will es endlich richtig machen.
Liebe Grüße
Poison