dedlfix: Werte in MySQL-DB schreiben nur umständlich möglich

Beitrag lesen

echo $begrüßung;

$hersteller = $_POST['hersteller'];

$bezeichnung = $_POST['bezeichnung'];
  $kapazitaet = $_POST['kapazitaet'];

$eintrag = sprintf("INSERT INTO usb (hersteller,bezeichnung,kapazitaet) VALUES ('%s', '%s', '%s')", mysql_real_escape_string($hersteller), mysql_real_escape_string($bezeichnung), mysql_real_escape_string($kapazitaet));
  $eintragen = mysql_query($eintrag);

  

> Kann mir jemand verraten, was an Variante 1 falsch ist bzw. wieso ich das über den für mich komplizierteren Weg 2 gehen muss?  
  
Variante 1 funktioniert nur mit dem veralteten PHP-Feature [Register Globals](http://www.php.net/manual/en/security.globals.php). Außerdem ist sie falsch, weil sie den Kontext "SQL-Statement" nicht berücksichtigt. Du übergibst die Werte ohne weitere Behandlung, was bestenfalls einen Syntaxfehler ergibt, wenn darin ein ' vorkommt. In weniger günstigen Fällen kann man mittels [SQL-Injection](http://www.php.net/manual/en/security.database.sql-injection.php) noch mehr anstellen. Um SQL-Injection zu vermeiden kennt PHP ein weiteres und ebenfalls veraltetes Feature namens [Magic Quotes](http://www.php.net/manual/en/security.magicquotes.php). Da du in Variante 2 mit mysql\_real\_escape\_string() selbst dafür sorgst, dass die Werte kontextgerecht behandelt werden, musst du auch dafür sorgen, dass die [Magic Quotes deaktiviert](http://www.php.net/manual/en/security.magicquotes.disabling.php) sind. Für Variante 2 ist es übrigens nicht notwendig, die Werte im $\_POST-Array nochmal in andere Variablen umzukopieren. Du kannst genauso gut $\_POST['hersteller'] an den Stellen verwenden, an denen du $hersteller verwendet hat. Bis auf das Umkopieren ist Variante 2 das Minimum, auch sicherheitstechnisch betrachtet. Sehr schön ist auch die Verwendung von sprintf(), das macht das SQL-Statement lesbarer als bei direkter Stringverknüpfung.  
  
  
echo "$verabschiedung $name";