English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
如果您通过网页获取用户输入的数据并将其插入一个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.
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}');
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)
Parameter | Beschreibung |
---|---|
String | Erforderlich. Bestimmen Sie den zu überprüfenden String. |
Zeichen | Optional. Bestimmen Sie die Zeichen oder Zeichenspanne, die durch addcslashes() betroffen sind. |
Konkretes Anwendungsbeispiel finden Sie hier:PHP addcslashes() Funktion