Folgendes Beispiel (Super Bad Practice – kommt aber durchaus so zu Stande): Ein Onlineshop möchte alle Produkte einer Kategorie anzeigen. Die Vernküpfung der Produkte zur Kategorie erfolgt über das Feld catid in der Tabelle Products.
<?php $catid = $_GET["catid"]; //ohne Validierung aus URL genommen $query = "select * from products where catid like $catid";
Jetzt nehmen wir mal an, der User manipuliert den Link und liefert für den GET Parameter catid Folgendes:
0;
UPDATE user SET Password=PASSWORD(’newpassword‘) WHERE user=’root‘;
FLUSH PRIVILEGES;
Das Ergebnis wäre ggf. fatal, nämlich, dass soeben das root Kennwot für den MySQL Server durch den User neu gesetzt wurde.
Was wir machen sollten, um das zu vermeiden:
- Der User für die DB Verbindung sollte nur das dürfen, was er unbedingt muss. -> Das Anlegen von neuen DB Usern über diesen aus dem obigen Beispiel hätte hierdurch schon unterbunden werden können.
- Prepared Statements mit gebundenen Variablen verwenden, werden zum Beispiel von PDO, MySQLi und anderen Bibliotheken angeboten. PDO siehe hier.
- Prüfen, ob er Input dem erwarteten Datentyp entspricht oder auf diesen setzen. Insb. bei int (is_numeric() / settype()).
- Nutzen der DB spezifischen Escape Funktionen (z.B. mysqli_real_escape_string)