Zitat von Patt
Beitrag anzeigen
Wenn du deine SQL-Abfragen absicherst geht es nicht nur darum deine Datenbank vor Schadcode (SQL-Injections) zu schützen - das ist eher der nette Nebeneffekt.
Es geht auch darum zu verhindern, dass Eingaben irgendwie mit der SQL-Syntax aneinander geraten und dadurch eine Zeichenkette bilden die z.B. deinen Query-String beenden udn dadurch dann unvollständig zur Datenbank geschickt würden.. wenn das Programm an der Stelle nicht abbrechen würden.
Das klassische Beispiel
PHP-Code:
$nachname = $_POST['nachname']; // Hier steht jetzt einfach mal O'Connor drauf
$sql = "SELECT * FROM personen WHERE nachname = '$nachname'";
echo $sql;
Es ist nicht schwierig sich da kurz einzulesen und die Umsetzung ist auch richtig easy, wenn man erstmal gesehen hat worauf es ankommt.
https://php-de.github.io/jumpto/kontextwechsel/
https://php-de.github.io/jumpto/sql-injection/
https://php-de.github.io/jumpto/pdo/
Das obige Beispiel würde über PDO und mit Prepared Statements so aussehen:
PHP-Code:
$sql = "SELECT * FROM personen WHERE nachname = ?";
$statement = $pdo->prepare($sql);
$statement->execute([$nachname]);
Anstatt direkt mysql_query($sql) aufzurufen, kommt stattdessen erst die prepare()-Methode damit die Datenbank die Struktur der Abfrage schon einmal verarbeiten kann und anschließend sendest du mit der execute()-Methode ein Array mit deinen Werten hinterher.
Als kleines extra, nachdem du die execute()-Methode aufgerufen hast, ist das statement bei der Datenbank immer noch einsatzbereit. Das heißt du könntest direkt noch einmal execute aufrufen und die Abfrage würde nochmal ausgeführt werden. Bei Selects macht das natürlich nur begrenzt Sinn, wenn du aber mehrere Inserts in die gleiche Tabelle ausführen möchtest ist das schon praktisch.
Kommentar