SQL-Injections in PHP vermeiden

In PHP steht zu diesem Zweck für fast jede verwendete Datenbank eine Escape-Funktion bereit.

Ein Beispiel für MySQL: anstatt

$abfrage = "SELECT spalte1
            FROM tabelle
            WHERE spalte2 = '".$_POST['spalte2Wert']."'";
$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");

sollte Folgendes verwendet werden:

$abfrage = "SELECT spalte1
            FROM tabelle
            WHERE spalte2 = '".mysql_real_escape_string($_POST['spalte2Wert'])."'";
$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");

Eine weitere Möglichkeit ist die Typumwandlung von Übergabeparametern.

$abfrage = "SELECT spalte1
            FROM tabelle
            WHERE spalte2 = " . intval($_POST['spalte2Wert']);
$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");

Ab PHP 5.1 sollten PHP Data Objects für Datenbankabfragen verwendet werden.

$dbh->exec("INSERT INTO REGISTRY (name, value)
            VALUES (".$dbh->quote($name,PDO::PARAM_STR).", ".$dbh->quote($value,PDO::PARAM_INT).")");

Oder als Prepared Statement:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam('name', $name);
$stmt->bindParam('value', $value);


Häufig wird aus Bequemlichkeit einfach die Konfigurationsoption „magic_quotes_gpc“ auf „on“ gestellt, mit der von außen kommende Benutzereingaben automatisch maskiert werden. Doch dies ist nicht empfehlenswert. Denn manche nicht selber programmierte Skripte setzen eigenständig Funktionen wie etwa addslashes() oder das bereits weiter oben genannte mysql_real_escape_string() ein. Das heißt, dass bereits allen relevanten Zeichen in den Benutzereingaben durch so genannte Magic Quotes ein Backslash vorangestellt wurde und nun durch die Escape-Funktion erneut ein Backslash vorangestellt wird. Somit werden die Benutzereingaben verfälscht und man erhält beispielsweise anstatt eines einfachen Anführungszeichens ein Anführungszeichen mit vorangestelltem Backslash (\“). Auch aus Gründen der Portabilität sollte bei der Entwicklung von Anwendungen auf diese Einstellung verzichtet und stattdessen alle Eingaben manuell validiert und maskiert werden, da nicht davon ausgegangen werden kann, dass auf allen Systemen dieselben Einstellungen vorherrschen oder möglich sind.

Das ist ein Auszug aus diesem Artikel

1 Kommentar » Schreibe einen Kommentar

  1. SQL Injections sind eine böse Sache. Hatte selber zwar noch nie großartige Probleme damit, weil man sie mehr oder weniger einfach umgehen kann. Momentan sind ja auch XSS-Attacken ganz „beliebt“.
    Anstelle von PDO benutzen ich MySQLi(OOP), einfach nur aus Gewohnheit. Oder hat PDO große Vorteile(außer mehr Datenbankunterstützungen) gegenüber MySQLi?
    lg PHP-Friends

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.