Jede Abfrage kann eingefügt werden, egal ob sie gelesen oder geschrieben, persistent oder transient ist. Injektionen können durchgeführt werden, indem eine Abfrage beendet und eine andere ausgeführt wird (möglich mit mysqli
), wodurch die beabsichtigte Abfrage irrelevant wird.
Jede Eingabe in eine Abfrage aus einer externen Quelle, sei es von Benutzern oder sogar intern, sollte als Argument für die Abfrage und als Parameter im Kontext der Abfrage betrachtet werden. Jeder Parameter in einer Abfrage muss parametrisiert werden. Dies führt zu einer ordnungsgemäß parametrisierten Abfrage, aus der Sie eine vorbereitete Anweisung erstellen und mit Argumenten ausführen können. Zum Beispiel:
SELECT col1 FROM t1 WHERE col2 = ?
?
ist ein Platzhalter für einen Parameter. Verwenden von mysqli
, können Sie mit prepare
eine vorbereitete Anweisung erstellen , binden Sie eine Variable (Argument) mit bind_param
an einen Parameter , und führen Sie die Abfrage mit execute
aus . Sie müssen das Argument überhaupt nicht bereinigen (tatsächlich ist es schädlich, dies zu tun). mysqli
tut das für dich. Der vollständige Prozess wäre:
$stmt = $mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();
Es gibt auch einen wichtigen Unterschied zwischen parametrisierten Abfragen und vorbereitete Erklärung . Diese Anweisung ist zwar vorbereitet, aber nicht parametrisiert und daher anfällig für Injektionen:
$stmt = $mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");
Zusammenfassend:
- Alle Abfragen sollten richtig parametrisiert sein (es sei denn, sie haben keine Parameter)
- Alle Argumente für eine Abfrage sollten unabhängig von ihrer Quelle so feindselig wie möglich behandelt werden