yo: speichert nicht

Gute Nacht,

ich möchte ganz einfach zwei daten in eine tabelle speicher...

<form action="Probe.php" method="get">
Nachname: <input name="Nachname" type="text" size="20" maxlength="30"><br><br>
Vorname: <input nama="Vorname" type="text" size="20" maxlength="30">
<input type="submit" value="speichern">
</form>

<?
$connect = mysql_connect("localhost","****","****");
mysql_select_db("test",$connect);

if ($_GET['Nachname'] & $_GET['Vorname']){
$teiln = mysql_query("insert into teiln (Nachname,Vorname) values
('".$_GET["Nachname"]."','".$_GET["Vorname"]."')",$connect);
}

aber irgendwo scheint wohl der Wurm drin zu sein...

Kanns leider nicht finden, vielleicht fällt ja jemanden was auf...

mbg yo

  1. Hallo yo.

    Fernab der Tatsache, dass du ungefiltert Benutzereingaben entgegen nimmst und damit Tür und Tor für Schindluder aller Art öffnest:

    if ($_GET['Nachname'] & $_GET['Vorname']){

    Dir ist bewusst, dass du hier eine Bitverknüpfung vornimmst?

    Einen schönen Samstag noch.

    Gruß, Mathias

    --
    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
    debian/rules
    1. Hallo Mazte,

      wie kann ich eine solche Filterung vornehmen?
      reicht es für die felder ein String zu nehmen, welcher Zeichen sollte ich auf jeden Fall ausschließen ?

      Wie nennt man solche Attacken?

      Das mit dem & hat so schon mal funktioniert, aber wie auch immer ..
      wie sollte ich es dann schreiben ? and ist das gleiche oder..?

      mbg yo

      1. Hallo yo.

        wie kann ich eine solche Filterung vornehmen?
        reicht es für die felder ein String zu nehmen, welcher Zeichen sollte ich auf jeden Fall ausschließen ?

        Es gibt dazu im PHP-Handbuch ein ganzes Kapitel. Das hiesige Archiv hat auch noch einiges an Information dazu.

        Wie nennt man solche Attacken?

        „SQL Injection“, siehe oben.

        Das mit dem & hat so schon mal funktioniert, aber wie auch immer ..
        wie sollte ich es dann schreiben ? and ist das gleiche oder..?

        Nein, das logische AND ist nicht das gleiche wie das bitweise &. Du meintest sicher das logische &&.

        Einen schönen Samstag noch.

        Gruß, Mathias

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules
        1. hi,

          ok, danke für den lesetipp, werde ich mir auf jeden Fall morgen mal antun.

          Leider funkt es auch mit dem logischen und nicht..

          Ist dir noch was aufgefallen, ich find einfach nichts mehr...

          mbg yo

          1. Hi Yo,

            So wie ich das verstehe, versuchst Du in der IF-Anweisung nur zu prüfen, ob die beiden Variablen gesetzt sind, oder?!

            Dann bau doch mal die If-Anweisung richtig, also jede Variable mit =="" abgelichen. Evtl sogar die $_GET[..] erst mal in eine Variable zuweisen....einen Fehler sehe ich sonst nicht in Deinem Code.

            Gruß, Hakan

            1. Hallo Hakan.

              Dann bau doch mal die If-Anweisung richtig, also jede Variable mit =="" abgelichen.

              Oder empty() nutzen.

              Evtl sogar die $_GET[..] erst mal in eine Variable zuweisen....

              Nein, das wäre Unsinn. $_GET[…] ist bereits eine Variable.

              Einen schönen Samstag noch.

              Gruß, Mathias

              --
              ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
              debian/rules
              1. Ich grüsse den Cosmos,

                Oder empty() nutzen.

                Erzeugt immer noch ein Notice, falls diese nicht gesetzt ist.

                Nein, das wäre Unsinn. $_GET[…] ist bereits eine Variable.

                Unter "richtigen" Programmiersprachen mault der Compiler sogar, wenn man den Speicherbereich, der einem nicht gehört, rumspielt. Und Superglobal bzw. deren Speicher gehört dem Programmierer nunmal nicht ;)

                Einen schönen Samstag noch.

                Bis 3 Uhr früh gearbeitet. Dafür mach ich mir nen schönen Sonntag :D

                Möge das "Self" mit euch sein

                --
                Fragt ein Atom das andere: Hast du mein Elektron gesehen? Ich bin heute so positiv.
                ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
  2. Hi,

    also bin mir nicht ganz sicher, aber versuch doch mal in der If-Anweisung statt des einfachen "&", ein doppelzeichen zu verwenden

    Also If ($_GET[...] && $_GET[...])

    Gruß,

    Hakan

    1. hallo,

      ja stimmt das doppelte gibts da ja noch, hat so aber leider auch nicht geklappt...

      danke trotzdem...

      mbg yo

  3. Hi yo!

    Kanns leider nicht finden, vielleicht fällt ja jemanden was auf...

    Setze error_reporting auf E_ALL. Vielleicht offenbart sich der Fehler ja dann.

    Bis auf die angesprochenen Fehler, kann ich ansonsten nichts entdecken.
    Vergiss nicht, die Usereingaben mit mysql_real_escape_string zu behandeln.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
  4. Guten Morgen!

    <input type="submit" value="speichern">(...)
    if ($_GET['Nachname'] & $_GET['Vorname']){

    Gib dem Submitbutton lieber einen Namen und frag den ab. Dann sparst du dir auch das "&&".
    Dann kannst du prüfen ob die Felder leer sind und z.B. nur Buchstaben
    und vielleicht noch Leerzeichen enthalten.
    Dann noch die Umlaute mit htmlentities o.ä. umwandeln und du hast nichts zu befürchten.
    (Zumindest kein Script-Injection)

    Dann versuch es mal so:

    $sql = mysql_query("INSERT INTO teiln (Nachname, Vorname) VALUES ('".$_GET["Nachname"]."','".$_GET["Vorname"]."') ");

    Eventuell hast du aber auch einen Fehler bei der Verbindung zur DB.
    Wird denn ein Fehler ausgegeben? Welcher?

    Grüße, Matze

    1. echo $begrüßung;

      Gib dem Submitbutton lieber einen Namen und frag den ab.

      Das bringt es nicht. Der Submit-Button muss zum Absenden nicht verwendet werden, z.B. dann, wenn das Formular mit Enter abgesendet wird. Der IE erkennt dann den Submit-Button nicht als aktiviert an und sendet nichts mit. Wenn du nun den Submit-Button befragst, sieht das Formular wie ungesendet aus.

      Dann kannst du prüfen ob die Felder leer sind und z.B. nur Buchstaben und vielleicht noch Leerzeichen enthalten.

      Die Prüfungen sollten aus logischer Sicht der Anwendung erfolgen. Dabei wären solche Fragen zu klären: Welche Felder müssen Werte enthalten? Wie müssen diese Werte aussehen (gültiger Zahlenwert, gültiges Datum, usw.)?

      Dann noch die Umlaute mit htmlentities o.ä. umwandeln und du hast nichts zu befürchten.

      Das ist nicht sinnvoll. Umlaute sind zum einen unschuldig, zum anderen haben solche HTML-spezifischen Notationen in einer Datenbank nichts zu suchen. Daten sollen immer erst dann in ein kontextspezifisches Format gebracht werden, wenn du sie in den jeweiligen Kontext bringst. Notierst du Bärbel als B&auml;rbel in der Datenbank, fällst du beispielsweise bei Abfragen nach Namen kürzer als 7 Buchstaben auf die Nase.

      htmlentities() soll erst zur Ausgabe in den HTML-Text verwendet werden, und dann reicht m Prinzip ein htmlspecialchars(), wenn man sich über die zu verwendende Zeichenkodierung seines Dokuments Gedanken gemacht hat.

      (Zumindest kein Script-Injection)

      SQL-Injection ist die Einschleusung von Befehlsbestandteilen über eine Dateneingabe. Daten werden aber erst dann zu Befehlsbestandteilen, wenn du den String verlässt, in dem die Daten eingefügt werden sollen. Dazu benötigst du das Zeichen ', welches du aber durch die Anwendung von htmlentities() unberührt lässt.

      Für eine MySQL-gerechte Maskierung von Daten sorgt die Funktion mysql_real_escape_string().

      Eventuell hast du aber auch einen Fehler bei der Verbindung zur DB.
      Wird denn ein Fehler ausgegeben? Welcher?

      Da wird vermutlich keiner ausgegeben oder nur ein PHP-Folgefehler. Denn es wurden, wie so oft von Anfängern, die Rückgabewerte der mysql_*-Funktionen ignoriert, die über einen Fehlerzustand informieren wollten. Der genaue Wortlaut der Fehlermeldung kann über die Funktion mysql_error() abgefragt werden.

      echo "$verabschiedung $name";

      1. Guten Morgen!

        Gib dem Submitbutton lieber einen Namen und frag den ab.

        Das bringt es nicht. Der Submit-Button muss zum Absenden nicht verwendet werden, z.B. dann, wenn das Formular mit Enter abgesendet wird. Der IE erkennt dann den Submit-Button nicht als aktiviert an und sendet nichts mit. Wenn du nun den Submit-Button befragst, sieht das Formular wie ungesendet aus.

        Ich benutze das z.B. wenn ich mehrere Submit-Buttons in einem Formular verwende. Z.B. Einer für "Ändern", einer für "Löschen".
        Muss aber nicht sein, da geb ich dir recht.
        Ich wollte ihm nur das "schwere Problem" mit dem "&&" ersparen^^

        Die Prüfungen sollten aus logischer Sicht der Anwendung erfolgen. Dabei wären solche Fragen zu klären: Welche Felder müssen Werte enthalten? Wie müssen diese Werte aussehen (gültiger Zahlenwert, gültiges Datum, usw.)?

        Also wenn die Felder "Vorname" und "Nachname" benannt sind, glaube ich den Kontext zu erkennen und kann deswegen auch auf Sonderzeichen verzichten. Daher reicht htmlentities in dem Fall IMHO aus.

        HTML-spezifischen Notationen in einer Datenbank nichts zu suchen.

        Das seh ich in dem Fall nicht so eng, geb dir aber grundsätzlich recht.

        Da wird vermutlich keiner ausgegeben oder nur ein PHP-Folgefehler.

        Jede Art Information über eine mögliche Fehlerausgabe wäre interessant.

        Grüße,
        Matze

        1. Moin!

          Also wenn die Felder "Vorname" und "Nachname" benannt sind, glaube ich den Kontext zu erkennen und kann deswegen auch auf Sonderzeichen verzichten. Daher reicht htmlentities in dem Fall IMHO aus.

          Absolut falsch!

          Es geht ja nicht darum, welche Daten du im freundlichen Normalbetrieb erwarten kannst, sondern welche Daten dir in feindlicher Angriffsumgebung geschickt werden.

          Und da hilft dir htmlentities() kein bißchen weiter für das Escaping des SQLs! Du bist immer noch anfällig für SQL-Injections. Da hilft nur mysql_real_escape_string().

          Hinterher die Namensfelder wieder in HTML zu packen ist aber natürlich ebenfalls ein Angriffspunkt. htmlspecialchars() sorgt dafür, dass alle eingegebenen Zeichen auch exakt wieder so im Text der Seite auftauchen - und nicht als HTML-Tags fehlinterpretiert werden.

          - Sven Rautenberg

          --
          "Love your nation - respect the others."
          1. Hallo,

            Es geht ja nicht darum, welche Daten du im freundlichen Normalbetrieb erwarten kannst, sondern welche Daten dir in feindlicher Angriffsumgebung geschickt werden.

            Richtig, und darum ging es mir auch nicht.
            Ich hatte bereits erwähnt die Variablen vorher auf das ausschließliche  Vorkommen von Buchstaben und eventuell Leerzeichen zu überprüfen.
            Wie man damit Injection betreiben kann, musst du mir erklären.
            Wenn ich jetzt also eh nur noch Buchstaben "durch gelassen" habe,
            was soll ich noch escapen?

            htmlspecialchars() sorgt dafür, dass alle eingegebenen Zeichen auch exakt wieder so im Text der Seite auftauchen - und nicht als HTML-Tags fehlinterpretiert werden.

            Mit Umlauten könnte man dabei aber Probleme bekommen.

            Grüße, Matze

            1. Moin!

              Es geht ja nicht darum, welche Daten du im freundlichen Normalbetrieb erwarten kannst, sondern welche Daten dir in feindlicher Angriffsumgebung geschickt werden.

              Richtig, und darum ging es mir auch nicht.
              Ich hatte bereits erwähnt die Variablen vorher auf das ausschließliche  Vorkommen von Buchstaben und eventuell Leerzeichen zu überprüfen.
              Wie man damit Injection betreiben kann, musst du mir erklären.

              Es geht nicht darum, durch irgendwelche Spezialbehandlung von Strings im Einzelfall auszuschließen, dass keine Injection stattfindet. Denn diese Spezialbehandlung kann man der Variablen, die in den SQL-String eingebaut wird, nicht ansehen.

              Es geht darum, dass Code sicher aussehen muß - auf den ersten Blick! Und dass jegliche Abweichung davon sofort Augen- oder Kopfschmerz bereiten sollte.

              Beim Einbau von variablen Anteilen in SQL-Strings bedeutet das: Bedingungsloses Escaping, egal welcher Variableninhalt zu erwarten ist.

              Wenn ich jetzt also eh nur noch Buchstaben "durch gelassen" habe,
              was soll ich noch escapen?

              Wenn du irgendwann deine Prüfung auf Buchstaben mal veränderst, oder sie durch einen Fehler unwirksam wird (auskommentiert, Fallabfrage falsch geschachtelt, etc.), dann kommt es ohne Escaping unerwartet zu Problemen - mit Escaping kann es _nie_ zu Problemen kommen.

              Wir alle sollten bestrebt sein, sichere Applikationen zu programmieren. Und das geht nur, indem man die häufigsten Anfängerfehler schon von vornherein ausschließt und Sicherheitsmechanismen trotzdem einbaut, obwohl durch weitergehende Überlegungen vielleicht herauskommen könnte, dass z.B. keines der ankommenden Zeichen durch das Escaping auch nur ein Bit geändert bekommt.

              htmlspecialchars() sorgt dafür, dass alle eingegebenen Zeichen auch exakt wieder so im Text der Seite auftauchen - und nicht als HTML-Tags fehlinterpretiert werden.

              Mit Umlauten könnte man dabei aber Probleme bekommen.

              Nein, das ist falsch.

              Natürlich muß man sich um das Encoding der Website Gedanken machen. Bei neuen erstellten Websites ist dieser Gedankengang aber ganz schnell beendet: Nimm UTF-8, und gut ist. Nur bei alten Websites ist die Sache diffiziler.

              - Sven Rautenberg

              --
              "Love your nation - respect the others."
              1. Hallo Sven,

                Ich stimme dir zu

                Letzlich sollte man sich dessen bewusst sein, was man bei Eingabefeldern alles verzapfen kann.
                Gegen ein bisschen "mehr Sicherheit" ist nichts einzuwenden.

                Einsichtig wie ich bin, geb ich dem OP dann auch gleich mal noch einen
                Link dazu mit auf den Weg: Botfalle

                Grüße, Matze

  5. Ich grüsse den Cosmos,

    if ($_GET['Nachname'] & $_GET['Vorname']){

    Du könntest mal diese Werte vor der Prüfung ausgeben lassen, welche Werte sie enthalten.
    Ansonsten solltest du sowas mit isset() prüfen da sonst ein Notice erzeugt wird.

    $teiln = mysql_query("insert into teiln (Nachname,Vorname) values
    ('".$_GET["Nachname"]."','".$_GET["Vorname"]."')",$connect);
    }

    Hier gehören die Werte noch auf Gültigkeit geprüft. Und dann reicht dir in deiner obigen Abfrage auch ein if(isset($_GET){}, um festzustellen, ob das Forumlar schon abgesendet wurde.

    Kanns leider nicht finden, vielleicht fällt ja jemanden was auf...

    Schonmal geprüft, ob die Verbindung zur Datenbank steht? Du musst Fehler besser abfangen, sonst quälst du dich beim Debugging unnötig.

    Möge das "Self" mit euch sein

    --
    Fragt ein Atom das andere: Hast du mein Elektron gesehen? Ich bin heute so positiv.
    ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
    1. Ich grüsse den Cosmos,

      if ($_GET['Nachname'] & $_GET['Vorname']){

      Du könntest mal diese Werte vor der Prüfung ausgeben lassen, welche Werte sie enthalten.

      ok, dachte eigentlich das diese im Adressfenster angehängt werden bei get, konnte aber nichts sehen...

      Ansonsten solltest du sowas mit isset() prüfen da sonst ein Notice erzeugt wird.

      Wo kann ich diesen Notice ablesen

      $teiln = mysql_query("insert into teiln (Nachname,Vorname) values
      ('".$_GET["Nachname"]."','".$_GET["Vorname"]."')",$connect);
      }

      Hier gehören die Werte noch auf Gültigkeit geprüft. Und dann reicht dir in deiner obigen Abfrage auch ein if(isset($_GET){}, um festzustellen, ob das Forumlar schon abgesendet wurde.

      Kanns leider nicht finden, vielleicht fällt ja jemanden was auf...

      Schonmal geprüft, ob die Verbindung zur Datenbank steht? Du musst Fehler besser abfangen, sonst quälst du dich beim Debugging unnötig.

      »»

      if($connect == true)
      echo "db steht"; reicht das so

      musste grad feststellen das nicht mal ein einfaches echo "halloeins";
      im browser ausgegeben wird....???

      Hab mit der Umgebung damals gut gearbeitet htmlkit komisch komisch...

      mbg yo

      1. hi,

        hab grad eine andere Anwendung versucht, da klappt alles wunderbar...

        jedenfalls werden nicht mal die Daten gesendet, denke es liegt am Formular ....

        mbg yo

      2. Ich grüsse den Cosmos,

        Wo kann ich diesen Notice ablesen

        Wie dir bereits gesagt wurde, sollst du dein error_reporting auf E_ALL umstellen.

        Möge das "Self" mit euch sein

        --
        Fragt ein Atom das andere: Hast du mein Elektron gesehen? Ich bin heute so positiv.
        ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)