PHP Ist dieser mysqli insert Befehl richtig escapet?

F

Fat32Tony

Gast
PHP:
<?php
$title = mysql_real_escape_string($_POST["title"]);
$author = mysql_real_escape_string($_POST["author"]);
...
$sql = "INSERT INTO title (title, author, kind)
VALUES ('$title', '$author', '0')";
?>

Ich als PHP Anfänger habe hier versucht einer SQL injection vorzubeugen. Das Script funktioniert auch weiterhin.
Ist das so in Ordnung oder habe ich einen Fehler begangen?

Grad wenig Zeit weil Mittagspause ^^

lg Tony
 
Oder direkt die PHP Data Objects mit Prepared Statements verwenden, dann bist Du sicher, objektorientiert und Datenbank unabhängig.

Da sieht das dann beispielsweise so aus:
Code:
<?php
$stmt = $dbh->prepare("INSERT INTO title (title, author, kind) VALUES (?, ?, '0')");
$stmt->bindParam(1, $_POST["title"]);
$stmt->bindParam(2, $_POST["author"]);

$stmt->execute();
?>
 
Würde auch letzteres bevorzugen.
Damit weiss nämlich schon php, was Daten sind, und was Befehl.

​MfG.
 
egal welche Variante genutzt wird, es ist noch nicht komplett richtig escaped. Man muss noch zuvor das MySQL-Connection-Charset definieren (z.B. mysqli_set_charset), sonst gibt es noch manche Angriffe wie man Attack-Vektoren an dem Escaper vorbeischleusen kann (UTF-7 Attacke).
 
davidbaumann schrieb:
Damit weiss nämlich schon php, was Daten sind, und was Befehl.
PHP weiß gar nichts. Mit der PDO werden einfach Query und Parameter getrennt gesendet und die DB kümmert sich ums richtige Escaping. Injections sind somit ausgeschlossen, außer die DB hat irgendwo Probleme.
 
mysql_real_escape_string ist definitiv falsch, wenn du MySQLi verwenden willst. Das ist die Steinzeit-Syntax, die dir in neueren PHP-Versionen direkt Deprecated-Warnings vor den Latz ballert.

Aber: Wie schon gesagt, abreißen und mit PDO neu bauen!

Oder du machst gleich Nägel mit Köpfen. Such dir ein anständiges Framework, z.B. Symfony2 oder Zend, und benutze es für deine Zwecke. Die Dinger haben alle eine gute Datenbank-Abstraktion.
 
Zurück
Oben