Danstaar: Register

Hallo,
ich habe viel Zeit darin investiert, ein Register-Script zu schreiben. Nun gibt es ein Problem . Es erscheint zwar die Erfolgsmeldung, allerdings sehe ich den Eintrag nicht in der Datenbank . Hier der Code:

  
<?php  
  
$submit = $_POST['submit'];  
  
$username = $_POST['username'];  
  
$password = $_POST['password'];  
  
$passconf = $_POST['passconf'];  
  
$vorname = $_POST['vorname'];  
  
$nachname = $_POST['nachname'];  
  
$birthday = $_POST['birthday'];  
  
$birthmonth = $_POST['birthmonth'];  
  
$birthyear = $_POST['birthyear'];  
  
$email = $_POST['email'];  
  
  
//--------------------------------------------  
  
if ($submit)  
{  
//Auf Eingaben überprüfen  
  
  
if ($username&&$vorname&&$nachname&&$birthday&&$birthmonth&&$birthyear&&$password&&$passconf&&$email)  
{  
  
 if ($password==$passconf)  
 {  
  if(strlen($username)>25||strlen($vorname)>25||strlen($nachname)>25)  
  {  
   echo "Der angegebene Benutzername, Vorname, oder Nachname ist zu lang!!";  
  }  
  else  
  {  
  
    //Passwortlänge überprüfen  
    if(strlen($password)>25||strlen($password)<6)  
    {  
     echo "Das Passwort muss zwischen 6 und 25 Zeichen beinhalten!";  
    }  
    else  
    {  
     //Registrierungsvorgang!  
     $connect = mysql_connect('localhost','root','');  
     mysql_select_db('youthnet');  
  
     $queryreg = mysql_query("  
  
     INSERT INTO users VALUES ('','$username','$vorname','$nachname','$password','$birthday','$birthmonth,'$birthyear','$email')  
  
     ");  
  
     echo "Sie wurden erfolgreich registriert!!";  
    }  
  
  
  
  }  
  
  
 }else  
       echo "Die von Ihnen eingegebenen Passwörter stimmen nicht überein!";  
  
}  
else  
    echo "Sie müssen alle Felder ausfüllen!";  
  
}  
  
  
  
  
  
  
  
  
?>  
  
<html>  
<h1>Registrieren:</h1><br>  
<form action="register.php" method="post">  
<table>  
<tr>  
<td>  
Gewünschter Username:  
</td>  
<td>  
<input type="text" maxlength="15" name="username" value="<?php echo $username ?>">  
</td>  
</tr>  
<tr>  
<td>  
Passwort:  
</td>  
<td>  
<input type="password" maxlength="16" name="password" value="<?php echo $password ?>">  
</td>  
</tr>  
<tr>  
<td>  
Passwort erneut eingeben:  
</td>  
<td>  
<input type="password" maxlength="16" name="passconf">  
</td>  
</tr>  
<tr>  
<td>  
Dein Vorname:  
</td>  
<td>  
<input type="text" maxlength="15" name="vorname" value="<?php echo $vorname ?>">  
</td>  
</tr>  
<tr>  
<td>  
Dein Nachname:  
</td>  
<td>  
<input type="text"  maxlength="25" name="nachname" value="<?php echo $nachname ?>">  
</td>  
</tr>  
<tr>  
<td>  
Geburtsdatum:  
</td>  
<td>  
<input type="text" maxlength="2" name="birthday" style="width: 30px;" value="<?php echo $birthday ?>">.<input type="text" maxlength="2" name="birthmonth" style="width: 30px;" value="<?php echo $birthmonth ?>">.<input type="text" maxlength="4" name="birthyear" style="width: 50px;" value="<?php echo $birthyear ?>">  
</td>  
</tr>  
<tr>  
<td>  
EMailAdresse:  
</td>  
<td>  
<input type="email" maxlength="30" name="email">  
</td>  
</tr>  
</table>  
<input type="submit"  class="submit" value="Registrieren!" name="submit">  
</form>  
</html>  
  

  1. Moin!

    ich habe viel Zeit darin investiert, ein Register-Script zu schreiben.

    Es wäre wesentlich schneller gegangen, wenn du die lange Liste des Variablenkopierens weggelassen hättest.

    Was hingegen fehlt, ist ein korrektes Escaping aller Daten, sowohl für MySQL als auch HTML. Lies bitte unbedingt http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel und http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel/erkennen_und_behandeln.

    Und die Fehlerbehandlung, wenn der Query fehlschlägt, fehlt ebenfalls.

    Dein Datenbankdesign ist auch noch verbesserungswürdig. Verwende zum Speichern eines Datums niemals drei Felder für Tag, Monat und Jahr, sondern ein einziges Feld vom Typ DATE. Dann sortiert dir die Datenbank die Einträge bei Bedarf nämlich auch chronologisch.

    Und speichere niemals Passwörter im Klartext. Verwende immer eine Hash-Funktion wie MD5 oder SHA1, idealerweise mit einem Salz-Wert zusätzlich.

    - Sven Rautenberg

    1. Hello,

      Dein Datenbankdesign ist auch noch verbesserungswürdig.

      Ich mag einfach mal fragen, wie das Create-Statement für die Tabelle users aussieht?

      Liegt auf der Spalte username ein Constraint? Dann sollte der auch ausgewertet werden.

      $queryreg wird zwar schon ganz richtig erzeugt, aber leider nicht ausgewertet.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Lieber Tom,

        $queryreg wird zwar schon ganz richtig erzeugt, aber leider nicht ausgewertet.

        das wäre ja auch noch schöner, denn dann hätten wir ein Scheunentor für SQL-Injection.

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Hello lieber Felix,

          $queryreg wird zwar schon ganz richtig erzeugt, aber leider nicht ausgewertet.

          das wäre ja auch noch schöner, denn dann hätten wir ein Scheunentor für SQL-Injection.

          Das verstehe ich jetzt nicht. Wieso öffnet die Auswertung eines Rückgabewertes einer Query ein Scheunentor?

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Lieber Tom,

            Das verstehe ich jetzt nicht. Wieso öffnet die Auswertung eines Rückgabewertes einer Query ein Scheunentor?

            es ist der Query-String und wie er zustande kommt. Das SQL-Statement wird mit ungefilterten POST-Werten erzeugt... da interessiert mich doch die Auswertung nimmer!

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. Hello Lieber Felix,

              Das verstehe ich jetzt nicht. Wieso öffnet die Auswertung eines Rückgabewertes einer Query ein Scheunentor?

              es ist der Query-String und wie er zustande kommt. Das SQL-Statement wird mit ungefilterten POST-Werten erzeugt... da interessiert mich doch die Auswertung nimmer!

              Das ist aber die falsche Betrachtungsweise. Jede Aktion an der richtigen Stelle. Nur, weil man das Escaping vergessen hat, darf man dann doch nicht auch noch die Auswertung des Rückgabewertes unterlassen. Wenn das passende Escping hergestellt ist, sollte es keine weitere Lücke mehr geben, nur weil jemand (Du) geschrieben hat, dass das unnötig sei...

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Bitte antwortet mir doch einfach meine Frage x.x

                1. Tach!

                  Bitte antwortet mir doch einfach meine Frage x.x

                  Es wäre auch fahrlässig von unserer Seite, wenn wir dir nicht deine gravierenden Sicherheitslücken aufzeigen würden. Dein eigentliches Problem kannst du lösen, indem du außer dem Beseitigen der Sicherheitslücken eine angemessene Fehlerbehandlung hinzufügst. Schau im Handbuch nach, wie die jeweils von dir verwendeten Funktionen im Fehlerfall reagieren, und füge deinem Code Fallunterscheidungen (if-else) hinzu, um auf diese möglichen Fehler zu reagieren. Datenbank-Fehler haben zudem die Angewohnheit, stumm zu sein. Den genauen Wortlaut, wenn eine der Funktionen einen Fehler signalisiert hat, bekommt man über mysql_error().

                  dedlfix.

  2. Hi,

    [code]

    du musst noch die Sprache angeben, damit du Syntax-highlighting bekommst.

    $submit = $_POST['submit'];

    das Umkopieren ist unnötig und verschleiert später die Herkunft der Variablen, was zu einem ernsten Sicherheitsproblem führt.

    if ($submit)

    ich würde dir empfehlen, die komplette Überprüfung in eine Funktion auszulagern. Du kannst wesentlich Einrückungstiefe sparen, da du dann sofort bei negativem Ergebnis die Funktion verlassen kannst.

    $queryreg = mysql_query("

    INSERT INTO users VALUES ('','$username','$vorname','$nachname','$password','$birthday','$birthmonth,'$birthyear','$email')
         ");

    a) überprüf den Rückgabewert von mysql_query.
    b) behandle deine Daten kontextgerecht. Du erlaubst hier deinen Usern beliebigen Zugriff auf deine Daten.

    Bis die Tage,
    Matti

    1. Tach!

      das Umkopieren ist unnötig und verschleiert später die Herkunft der Variablen, was zu einem ernsten Sicherheitsproblem führt.

      Nicht die Herkunft ist das Sicherheitsproblem sondern der unbedachte Umgang beim Weiterreichen von Daten. Das gilt für sämtliche Daten, nicht nur für direkte Eingabedaten der Anwender. Das Umkopieren sorgt lediglich für mehr Komplexität durch die zusätzlichen Variablen.

      $queryreg = mysql_query("
           INSERT INTO users VALUES ('','$username','$vorname','$nachname','$password','$birthday','$birthmonth,'$birthyear','$email')
           ");
      b) behandle deine Daten kontextgerecht. Du erlaubst hier deinen Usern beliebigen Zugriff auf deine Daten.

      Die fehlende Kontextwechselbeachtung an der Stelle ist unbestritten, aber mit mysql_query() abgesetzte Statements können lediglich im Rahmen der Syntaxmöglichkeiten des vorhandenen Statements erweitert werden. Es ist nicht möglich, das Statement abzuschließen und zum Beispiel ein DELETE anzuhängen. Mit dem was stattdessen geht, lässt sich immer noch so einiges anstellen, aber eben nicht beliebig alles.

      dedlfix.

  3. Ich hab
    nichmal nen Plan was ein Kontext is
    ehrlich gesagt.

    1. Hi,

      Ich hab
      nichmal nen Plan was ein Kontext is
      ehrlich gesagt.

      hast du den Artikel gelesen, den Sven und ich gelinkt haben? Da steht es mit einfachen Beispielen erklärt drin.

      Bis die Tage,
      Matti