English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MySQL-und-SQL-Injection

如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题。

本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符。

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。

以下示例中,输入的用户名必须为字母、数字及下划线的组合,且用户名长度为 8 到 20 个字符之间:

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

Lassen Sie uns die SQL-Situation betrachten, die bei der Nichtfilterung spezieller Zeichen auftritt:

// Setzen Sie $name, um die SQL-Anweisungen, die wir nicht benötigen, einzufügen
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}');

.In den obigen Injektionsanweisungen haben wir die Variable $name nicht gefiltert, $name enthält SQL-Anweisungen, die wir nicht benötigen, und löscht alle Daten der Tabelle users.

In PHP ist mysqli_query() nicht dazu berechtigt, mehrere SQL-Anweisungen auszuführen, aber in SQLite und PostgreSQL ist es möglich, mehrere SQL-Anweisungen gleichzeitig auszuführen, daher müssen wir die Daten der Benutzer streng überprüfen.

Um SQL-Injektionen zu verhindern, müssen wir auf folgende Punkte achten:

  • 1.Vertrauen Sie niemals dem Benutzerinput. Überprüfen Sie die Eingaben des Benutzers, indem Sie reguläre Ausdrücke verwenden oder die Länge begrenzen; überprüfen Sie Anführungszeichen und Doppelzitate-" für Transformationen und so weiter.

  • 2.Verwenden Sie niemals dynamisch generierte SQL, verwenden Sie parametrisierte SQL oder Prozeduren zur Datenabfrage und -speicherung.

  • 3.Verwenden Sie niemals Datenbankverbindungen mit Administratorrechten, verwenden Sie für jede Anwendung separate Datenbankverbindungen mit begrenzten Berechtigungen.

  • 4.Lassen Sie keine geheimen Informationen direkt speichern, verschlüsseln oder hashen Sie Passwörter und sensible Informationen.

  • 5.Die Anwendung sollte so wenig wie möglich anormalen Informationen liefern, am besten verwenden Sie benutzerdefinierte Fehlermeldungen, um die ursprünglichen Fehlermeldungen zu verpacken

  • 6.Die Methode zur Detektion von SQL-Injektionen umfasst in der Regel Hilfssoftware oder Plattformen für Website-Sicherheit, Software wie den SQL-Injektionsdetektortool jsky, Plattformen wie den Yisi Website Security Platform Detection Tool. MDCSOFT SCAN usw. Verwenden Sie MDCSOFT-IPS kann effektiv SQL-Injektionen, XSS-Angriffe und andere abwehren.

Verhindern Sie SQL-Injektionen

In Skriptsprachen wie Perl und PHP können Sie die von Benutzern eingereichten Daten escapen, um SQL-Injektionen zu verhindern.

PHPs MySQL-Erweiterung bietet die Funktion mysqli_real_escape_string() an, um spezielle Eingabezeichen zu escapen.

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

SQL-Injektion in der LIKE-Anweisung

Bei einer LIKE-Abfrage tritt dieses Problem auf, wenn der Benutzer Werte mit "_" und "%" eingibt: Der Benutzer wollte ursprünglich "abcd_" abfragen, aber das Suchergebnis enthält "abcd_", "abcde", "abcdf" und so weiter; der Benutzer muss "30%" (Anmerkung: 30%) kann ebenfalls Probleme verursachen.

In PHP-Skripten können wir die Funktion addcslashes() verwenden, um die obigen Situationen zu behandeln. Ein Beispiel ist wie folgt:

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

addcslashes() Funktion fügt vor angegebenen Zeichen einen Backslash hinzu.

Syntax-Format:

addcslashes(string,characters)
ParameterBeschreibung
StringErforderlich. Bestimmen Sie den zu überprüfenden String.
ZeichenOptional. Bestimmen Sie die Zeichen oder Zeichenspanne, die durch addcslashes() betroffen sind.

Konkretes Anwendungsbeispiel finden Sie hier:PHP addcslashes() Funktion