Peter: Formularfeld

Hallo

Was mache ich falsch:

Mein Eingabeformular:
html>
    <head>
        <title>test</title>
    </head>

<body>

<form  action="add.php" method="post" >

<br>
      <table>

<tr>

<td> name </td>  <td> <input name="naam" type="text">   </td>

<td> PW </td>  <td> <input name="pwd" type="password">   </td>

</table>

<br> <br>
        <button name="buttonName" type="submit">Registrieren</button></td>
             </form>
     </body>
</html>

und nun meine add.php Datei:

<?php
include ("config.php");
$sql="INSERT INTO users (Name, Password) VALUES ('$naam', '$pwd')";
$query=mysql_query($sql);
if(!$query) echo mysql_error();
else echo "Der Benutzer $Name wurde erfolgreich eingefügt";
?>

Wenn ich in meiner SQL Datenbank nachschauen, wird nichts eingetragen.

Probier das Problem nun schon seit Stunden zu lösen

Danke herzlich für Lösungen

  1. hallo!

    in deiner add.php haben deine variablen noch keinen inhalt.
    verwende statt $naam $_POST['naam'], dann funktionierts.

    ausserdem solltest du auf eine korrekte einbindung achten.
    statt:
    echo "Der Benutzer $Name wurde erfolgreich eingefügt";

    richtig:
    echo "Der Benutzer ".$Name." wurde erfolgreich eingefügt";

    lg,
    der-daniel

    1. Hello Daniel,

      ausserdem solltest du auf eine korrekte einbindung achten.
      statt:
      echo "Der Benutzer $Name wurde erfolgreich eingefügt";

      richtig:
      echo "Der Benutzer ".$Name." wurde erfolgreich eingefügt";

      Die Varianten sind in PHP beide richtig.
      http://www.php.net/manual/de/language.types.string.php

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau

  2. Hi!

    Wenn ich in meiner SQL Datenbank nachschauen, wird nichts eingetragen.

    Nur mal so ein Rateversuch:
    register_globals ist in der php.ini auf off gesetzt.
    $naam und $pwd gibt es daher nicht. Versuche $_POST['naam'] und $_POST['pwd'].

    else echo "Der Benutzer $Name wurde erfolgreich eingefügt";

    Woher sollte denn $Name kommen?
    Scheint es mir auch nicht zu geben...

    Du solltest eine Abfrage einbauen, ob das Formular überhaupt abgeschickt wurde.
    Außerdem ist das Script so anfällig für einen Angriff mittels SQL-Injection.

    Schöner Gruß,
    rob

    1. Du solltest eine Abfrage einbauen, ob das Formular überhaupt abgeschickt wurde.

      hast du mir dazu ein kleiner Gedankensprung?

      Außerdem ist das Script so anfällig für einen Angriff mittels SQL-Injection.

      1. Wie könnte so ein Angriff aussehen?

      2. Wie kann ich dies verhindern?

      Ich dachte um so  "einfacher, weniger Code" umso besser.....

      Peace Peter

      1. Hi!

        Du solltest eine Abfrage einbauen, ob das Formular überhaupt abgeschickt wurde.

        hast du mir dazu ein kleiner Gedankensprung?

        if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
        oder
        if ( isset( $_POST['was_auch_immer'] ) )

        Außerdem ist das Script so anfällig für einen Angriff mittels SQL-Injection.

        1. Wie könnte so ein Angriff aussehen?

        Man trägt SQL-Code anstatt eines Namens in deinem Formular ein.
        Hättest du mal eine Suchmaschine benutzt, dann hättest du zu diesem Thema bereits was gefunden.
        Auch die Suche hier im Forum und/oder im Forumsarchiv hätte dir einige Treffer gebracht.
        Wikipedia-Artikel "SQL-Injektion"

        1. Wie kann ich dies verhindern?

        Du mußt _alle_ Variablen, die von außen kommen prüfen und bereinigen.
        Nie, nie, niemals darfst du die Variablen ungeprüft in deine Abfragen einbauen!
        Alle Variablen von außen müssen grundsätzlich als "böse" angesehen werden.
        Hier habe ich auch was dazu geschrieben. Mußt mal dieses Posting durchlesen:
        http://forum.de.selfhtml.org/archiv/2007/4/t150370/#m977240

        Ich dachte um so  "einfacher, weniger Code" umso besser.....

        Nein. Lieber ein paar zusätzliche Abfragen mehr einbauen.
        Es muß auch nicht unbedingt ein Angriff auf deine Site sein.
        Es kann auch immer sein, daß irgendwelche Deppen einfach Mist eingeben.
        Also lieber eine DAU-Abfrage (DAU = Dümmster anzunehmender User) mehr einbauen als zuwenig.
        Eine clientseitige Prüfung mit Javascript ist niemals ausreichend.
        Du mußt alles serverseitig prüfen, bevor du was weiterverarbeitest.
        Prüfe also z.B. ob in ein Namensfeld auch wirklich nur Buchstaben eingegeben wurden oder ob in einem Emailfeld auch wirklich eine gültige Mailadresse eingetragen wurde oder ob in einem Feld für eine Telefonnummer auch wirklich nur Zahlen und Zeichen wie /-() stehen, und so weiter und so fort...

        Schöner Gruß,
        rob

      2. Hello,

        1. Wie könnte so ein Angriff aussehen?

        Vielleicht hilft Dir eher, warum er möglich ist.

        Daten, die am Client erfasst werden, werden unverändert als Parameter an das Script übertragen. PHP holt sie aus dem Environment automatisch heraus und stellt sie im Script in den bekannten Variablen

        $_POST
          $_GET

        usw. (die anderen unterschlage ich jetzt mal) zur Verfügung.
        Wir wollen hier annehmen, dass sie immer noch unverändert sind.

        Wenn Du nun ein SQL-Statement absetzt, wird dieses nicht über einen Blockbuffer abgewickelt der Variablenwerte übernimmt, sondern über eine Textschnittstelle, die das gesamte Statement inclusive der Datenwerte als Text an dee SQL-Schnittstelle DMBS weiterleitet. Erst diese trennt Befehle und Daten wieder und erzeugt die passenden internen Aufrufe.

        Ein Teil des Statements ist ein Deinem Script vorgegeben, andere Teile kommen über die Parameter ins Script. Variablenwerte werden, wenn sie Texte sind, immer in Häkchen an die SQL-Schnittstelle übergeben. Das bedeutet also, dass ein Häkchen den Variablentext einleitet und ein weiteres Häkchen den Variablentext wieder beendet. Was passiert aber, wenn der Variablentext selber ein Häkchen enthält? Dann wäre für die SQL-Schnittstelle der Variablentext an dieser Stelle zuende und es würde wieder eine Befehlssequenz folgen.

        Um dies zu unterbinden, müssen Variablentexte vorbehalndelt werden. Das übernimmt PHP gerne mit einer Funktion, die auf das DBMS abgestimmt sein muss.

        $variablentext = "'" . mysql_real_escape_string($textvariable,$con) . "'";

        Bei MySQL übernimmt das diese Funktion.
        Da sie sich über die Connection auch noch Informationen besorgt, wie das DBMS die Vorbehandlung gerne hätte, bnötigt sie die Verbindungskennung (Connection-Handle) zusätzlich zur Variable.

        PHP hat nun, um schlimmstes zu verhüten, eine eingebaute Funktion "magic Quotes", die die Paramter des Environments automatisch behandelt, bevor sie in die Variablen des Scriptes überstellt werden. Dies Funktion passt aber nicht zu den meisten Datenbanken. Deshalb sollte man sie lieber ausschalten und DANN SELBER DARAN DENKEN, oder die Maskierung (Escaping) der Zeichen wieder rückgängig machen.

        Siehe auch http://www.php.net/manual/en/function.get-magic-quotes-gpc.php

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau