Wie verhindert MySQL die SQL-Injektion? SQL-Injection-Prinzip und -Prävention

MySQLWie kann man eine SQL-Injektion verhindern? SQL-Injection-Prinzip und -Prävention

MySQL und SQL-Injection

Wenn Sie die vom Benutzer über eine Webseite eingegebenen Daten übernehmen und in eineMySQL-Datenbank, dann kann es zu SQL-Injection-Sicherheitsproblemen kommen.

In diesem Kapitel wird vorgestellt, wie Sie SQL-Injection verhindern und die in SQL eingefügten Zeichen durch Skripte filtern können.

Die sogenannte SQL-Injection soll den Server dazu verleiten, böswillige SQL-Befehle auszuführen, indem SQL-Befehle in das Webformular eingefügt werden, um die Abfragezeichenfolge des Domänennamens oder der Seitenanforderung zu übermitteln oder einzugeben.

Wir sollten Benutzereingaben niemals vertrauen, wir müssen davon ausgehen, dass Benutzereingabedaten unsicher sind, und wir alle müssen Benutzereingabedaten filtern.

Im folgenden Beispiel muss der eingegebene Benutzername eine Kombination aus Buchstaben, Zahlen und Unterstrichen sein und der Benutzername muss zwischen 8 und 20 Zeichen lang sein:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, "SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 输入异常";
}

Werfen wir einen Blick auf die SQL-Situation, die auftritt, wenn keine Sonderzeichen gefiltert werden:

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

In der obigen Injektionsanweisung haben wir die Variable von $name nicht gefiltert, und die SQL-Anweisung, die wir nicht benötigen, wird in $name eingefügt, wodurch alle Daten in der Benutzertabelle gelöscht werden.

mysqli_query() in PHP darf nicht mehrere SQL-Anweisungen ausführen, aber in SQLite und PostgreSQL können mehrere SQL-Anweisungen gleichzeitig ausgeführt werden, daher müssen wir die Daten dieser Benutzer streng überprüfen.

Um eine SQL-Injection zu verhindern, müssen wir folgende Punkte beachten:

  • 1. Vertrauen Sie niemals Benutzereingaben.Überprüfen Sie die Benutzereingaben, Sie können reguläre Ausdrücke verwenden oder die Länge begrenzen, einfache Anführungszeichen und doppelte "-" konvertieren usw.
  • 2. Verwenden Sie niemals dynamisches Assembly-SQL, Sie können parametrisiertes SQL verwenden oder direkt gespeicherte Prozeduren für die Datenabfrage und den Zugriff verwenden.
  • 3. Verwenden Sie niemals Datenbankverbindungen mit Administratorrechten, verwenden Sie separate Datenbankverbindungen mit eingeschränkten Rechten für jede Anwendung.
  • 4. Speichern Sie vertrauliche Informationen nicht direkt, verschlüsseln oder hacken Sie Passwörter und sensible Informationen nicht.
  • 5. Die Ausnahmeinformationen der Anwendung sollten so wenige Hinweise wie möglich geben, und es ist am besten, benutzerdefinierte Fehlerinformationen zu verwenden, um die ursprünglichen Fehlerinformationen einzuschließen
  • 6. Die Erkennungsmethode der SQL-Injektion verwendet im Allgemeinen Hilfsmittel软件Oder die zu erkennende Website-Plattform, die Software verwendet im Allgemeinen das SQL-Injection-Erkennungstool jsky, und die Website-Plattform verfügt über das Yisi-Website-Sicherheitsplattform-Erkennungstool. MDCSOFT SCANet al.Die Verwendung von MDCSOFT-IPS kann effektiv vor SQL-Injection, XSS-Angriffen usw. schützen.

SQL-Injection verhindern

In Skriptsprachen wie Perl und PHP können Sie die vom Benutzer eingegebenen Daten mit Escapezeichen versehen, um eine SQL-Injection zu verhindern.

Die MySQL-Erweiterung für PHP stellt die Funktion mysqli_real_escape_string() bereit, um spezielle Eingabezeichen zu maskieren.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Injektion in Like-Anweisungen

Wenn der Benutzer bei Abfragen wie "_" und "%" Werte eingibt, geschieht Folgendes: Der Benutzer wollte ursprünglich "abcd_" abfragen, aber die Abfrageergebnisse enthalten "abcd_", "abcde" und "abcdf " Etc.; das Problem tritt auch auf, wenn der Benutzer "30%" (Anm.: dreißig Prozent) abfragen möchte.

Im PHP-Skript können wir die Funktion addcslashes() verwenden, um die obige Situation zu handhaben, wie im folgenden Beispiel:

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

Die Funktion addcslashes() fügt vor dem angegebenen Zeichen einen umgekehrten Schrägstrich ein.

Syntaxformat:

addcslashes(string,characters)
参数描述
SchnurErforderlich.Gibt die zu überprüfende Zeichenfolge an.
ZeichenOptional.Gibt das Zeichen oder den Zeichenbereich an, der von addcslashes() betroffen ist.

Hoffnung Chen Weiliang Blog ( https://www.chenweiliang.com/ ) geteilt "Wie verhindert MySQL die SQL-Injektion? SQL-Injection-Prinzip und -Prävention", wird es Ihnen helfen.

Willkommen, um den Link dieses Artikels zu teilen:https://www.chenweiliang.com/cwl-500.html

Willkommen im Telegrammkanal von Chen Weiliangs Blog, um die neuesten Updates zu erhalten!

🔔 Seien Sie der Erste, der den wertvollen „ChatGPT Content Marketing AI Tool Usage Guide“ im Kanal-Top-Verzeichnis erhält! 🌟
📚 Dieser Leitfaden enthält einen enormen Mehrwert. 🌟Dies ist eine seltene Gelegenheit, verpassen Sie sie nicht! ⏰⌛💨
Teilen und liken, wenn es euch gefällt!
Ihr Teilen und Ihre Likes sind unsere ständige Motivation!

 

发表 评论

Deine Email-Adresse wird nicht veröffentlicht. 必填 项 已 已 * 标注

nach oben scrollen