$sql = "SELECT * FROM tabelle WHERE username = '".$username."' AND password = '".$password."'";
Werden die Daten aus dem Formular mittels solchen MySQL-Anfragen an die Datenbank gesendet, so kann MySQL-Injection verwendet werden, um sich von außen unerlaubten Zugriff auf die Datenbank zu verschaffen. Da nämlich $username einen Wert enthält, der direkt von Benutzer eingegeben wurde, also einen beliebigen Wert haben kann, kann so die MySQL-Anfrage manipuliert werden. So ist es beispielsweise möglich, die eigentliche Anfrage durch den Wert der Variable $username abzuschließen und eine weitere Anfrage zu starten. Um das zu verhindern, verwendet man prepared statements:
$sql = "SELECT * FROM tabelle WHERE (username=?) AND (password=?)";
Das "?" ist hier jeweils ein Platzhalter für die Benutzereingaben, die dann erst später im Code hinzugefügt werden:
if($query = $db->prepare($sql)) {
$query->bind_param("ss", $username, $password);
$query->execute();
// Das zurückgelieferte Ergebnis holen
$result = $query->get_result();
// Wenn mindestens ein Ergebnis-Datensatz: Datensätze in Schleife holen
if(mysqli_num_rows($result>0)) {
while($row = mysqli_fetch_array($result)) {
echo $row['Spaltenname der Tabelle'];
}
}
$query->close();
}
"ss" steht hierbei für "String String", da es sich im Beispiel bei beiden verwendeten Werten um Strings handelt. Dadurch, dass die Benutzereingaben also nicht direkt in die MySQL-Anfrage kopiert werden, kann MySQL-Injection nicht mehr angewendet werden.
Keine Kommentare:
Kommentar veröffentlichen