ingobar: Verständnisproblem bei mysql_query und POST

Hallo zusammen,

so jetzt habe ich nur noch eine Frage für heute (das hoffe ich zumindest). Folgendes verstehe ich nicht:

Ich habe folgende php-Datei:

<?php
 include 'inc/inc_config.php';
 $db = @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die(mysql_error());
 @mysql_select_db(MYSQL_DATABASE,$db) or die(mysql_error());

 $name = $_POST['l_name'];

 $insert_user_daten = @mysql_query("INSERT INTO userdata (name) VALUES ($name)");

 print_r($insert_user_daten);
?>

Das hat aber nie was eingetragen bis ich folgendes gemacht habe: Ich habe in meinem Input-Field "meinName" mit Anführungszeichen(!!) geschrieben.

Das verstehe ich nicht. Vielleicht hier noch weitere Infos:
Wenn der User auf den Speicher-Button klickt wird folgendes JavaScript gemacht:

  var data2send = "l_name="+escape(document.getElementById("l_name").value);
  if (user_ajax_db_anfrage!=null) {
   user_ajax_db_anfrage.open("POST", url, true);
   user_ajax_db_anfrage.onreadystatechange = zeigeBestaetigung;
   user_ajax_db_anfrage.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   user_ajax_db_anfrage.send(data2send);
}

Das Ganze ist eine AJAX-Kontruktion. Bislang habe ich immer GET genommen. Ist das der Grund weswegen ich jetzt auf einmal Anführungszeichen brauche? Oder liegt es an dem setRequestHeader. Den kenne ich so nicht und habe ihn einfach so übernommen (macht man nicht, ich weiß. Ich dachte es hat keine große Auswirkung ;) )

  1. Hallo,

    Das hat aber nie was eingetragen bis ich folgendes gemacht habe: Ich habe in meinem Input-Field "meinName" mit Anführungszeichen(!!) geschrieben.

    Das ist relativ leicht zu erklären:
    "meinName" ist ein String, und als solcher will mysql ihn auch verstanden wissen.

    Eine (naive) Lösung wäre, zu schreiben:

    $insert_user_daten = @mysql_query("INSERT INTO userdata (name) VALUES ('$name')");

    Das wird auf den ersten Blick funktionieren.
    Aber was passiert, wenn ein User
    eingibt

    Max 'Mustermann

    ?

    Dann beendet Mysql den String vor Mustermann, und weiss dann mit "Musztermann" nichts mehr anzufangen.

    Schlimmer noch, der Benutzer könnte eingeben

    Max '; DROP TABLE userdata

    Herzlichen Glückwunsch :)
    (SQL-Injection nennt man dann das).

    Aber es gibt Rettung ! :)

    Hope tah helps,

    Jörg

    1. Max '; DROP TABLE userdata

      äh nee...
      Max '); DROP TABLE userdata;

      glaub ich... so ähnlich jedenfalls.

      Hope tah helps,

      Tja bedauerlicherweise gibt es noch keine PHP-Funktion, die meine Rechtschreibfehler korrigiert...es wäre an der Zeit, so etwas mal zu entwickeln ;)!

      Jörg

      1. echo $begrüßung;

        Max '; DROP TABLE userdata

        äh nee...
        Max '); DROP TABLE userdata;

        Egal, wie du es schreibst, beides funktioniert unter PHP nicht. mysql_query() arbeitet nur ein Statement ab. Für mehr als ein Statement in einer PHP-Funktion braucht es zum einen die MySQL Improved Extension und zum anderen davon die Funktion mysqli_multi_query().

        Nichtsdestotrotz kann man sich mit SQL-Injection auch bei nur einem Statement genug Ärger einhandeln.

        echo "$verabschiedung $name";

    2. $insert_user_daten = @mysql_query("INSERT INTO userdata (name) VALUES ('$name')");

       Warum hat das dann bei GET ohne Anführungszeichen geklappt. Den im Grunde habe ich Datei von einem alten Projekt übernommen, wo ich noch mit GET gearbeitet habe und das hat damals wunderbar funktioniert.

      Anyway, danke für den Tipp. Ich schaue mir mal den Link an.