Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ein Injektionsangriff, der mit mysql_query erfolgreich ist, aber mit mysqli_query fehlschlägt

Ich wurde zu der Annahme verleitet, dass:

$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' ");

kann leicht mit Werten für $idValue kompromittiert werden die den ' schließen und fügen Sie dann zusätzliche Befehle hinzu, wie z. B.

$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL";

Mir ist zwar klar, dass Sie angeben, dass mehrere Anweisungen deaktiviert sind, aber etwas, das nicht so schrecklich wäre, wäre, nicht autorisierte Daten zurückzugeben, anstatt Daten in der Tabelle direkt zu bearbeiten, wie zum Beispiel:

  $idValue = "z' OR name IS NOT NULL OR name = 'x";

Wohingegen bei MySQLi die Möglichkeit besteht dass der Ansatz mit prepared statements verwendet werden kann , was verhindern würde, dass die Variable außerhalb ihres Status nur als Variable agiert. Zum Beispiel:

mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1");
mysqli->bind_param("s",$idValue);
mysqli->execute();

Mein Verständnis von bind_param ist, dass die Variable alle MySQL-Schlüsselwörter und Schlüsselzeichen maskiert hätte, wodurch die Sicherheitsverletzung und die Rückgabe nicht autorisierter Zeilen verhindert würden.

Dies ist eine Option, die MySQL nicht hat . Vorbereitete Aussagen helfen beim Verbessern Injektionssicherheit, aber sie werden sie nicht verhindern Injection-Angriffe allein, aber mehr sollten als Teil einer umfassenderen Strategie vom Programmierer verwendet werden.

Genauso wie das Tragen von Körperpanzern Sie nicht unbesiegbar macht, aber Ihre Überlebenschancen erheblich verbessert. MySQLi ist kein Allheilmittel und PDO auch nicht, aber sie werden das Sicherheitsniveau insgesamt verbessern.

MySQL ist ebenfalls veraltet, und wie Christopher feststellte, bedeutet die Nicht längerpflege, dass die Anzahl der Lücken und Probleme damit nur zunehmen wird, wenn sich andere Technologien weiterentwickeln.

Zusammenfassung

Wenn Sie MySQLi schreiben Anweisungen auf die gleiche Weise wie Sie MySQL-Anweisungen geschrieben haben, haben Sie keinen zusätzlichen Schutz vor Injektionen. Allerdings bietet MySQLi die Prepared Statements an Ansatz, der den Schutz gegen SQL-Injection erheblich erhöht, aber die Änderung der zugrunde liegenden Datenbankschnittstelle an sich bietet Ihnen keine inhärenten Vorteile oder Schutzmaßnahmen, es sei denn, Sie entscheiden sich dafür, diese mithilfe vorbereiteter Anweisungen selbst zu codieren .