Zum Inhalt springen

PHP Sicherheit: SQL Injections

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)