In der Webentwicklung ist die SQL -Injektion eine gemeinsame Angriffsmethode. Angreifer manipulieren die Datenbank, indem sie böswilligen Code in SQL -Abfrageanweisungen einfügen und dann Daten stehlen, ändern, löschen und sogar Systemberechtigungen erhalten. Um die SQL -Injektion zu verhindern, müssen PHP -Entwickler wirksame Maßnahmen ergreifen, um die Sicherheit der Datenbank zu schützen. In diesem Artikel wird vorgestellt, wie Sie sichere Abfragen durch die Real_Query -Funktion ausführen, um das Risiko einer SQL -Injektion zu vermeiden.
Die SQL -Injektion ist eine Sicherheitsanfälligkeit, die auftritt, wenn Entwickler die Benutzereingaben nicht ordnungsgemäß behandeln. Der Angreifer trägt die Logik der Datenbankabfrageanweisungen durch Eingabe speziell erstelltes SQL -Code, um illegale Operationen zu erreichen. Gemeinsame Angriffsmethoden sind:
Sehen Sie sensible Daten in der Datenbank an
Daten löschen oder ändern
Bypass -Authentifizierung
Überprüfen und reinigen Sie die Benutzereingabe immer : Alle von den Benutzern eingegebenen Daten enthalten möglicherweise böswillige Inhalte, und Entwickler müssen der Eingabe filtern oder entkommen, um sicherzustellen, dass diese Daten die SQL -Abfragen nicht beeinträchtigen können.
Verwenden Sie Vorverarbeitungsanweisungen und Parameterbindung : Vorverarbeitungsanweisungen können SQL -Anweisungen von der Benutzereingabe trennen, wodurch böswillige Eingaben, die die Struktur von SQL -Anweisungen direkt beeinflussen, direkt vermeiden können.
Einschränken der Datenbank Benutzerberechtigungen : Datenbankkonten sollten nur Berechtigungen haben, um die erforderlichen Vorgänge auszuführen, um zu vermeiden, dass Datenbankkonten zu viele Berechtigungen gewährt werden.
Verwenden von SQL -Abfrageprotokollen : Durch Aufzeichnen und Analysieren von SQL -Abfrageprotokollen können Entwickler potenziell böswilliges Verhalten entdecken und blockieren.
real_query ist eine Funktion, die von der MySQLI -Erweiterung in PHP bereitgestellt wird und zur Ausführung von SQL -Abfragen verwendet wird. Wenn Sie die ursprüngliche SQL -Abfrage ausführen müssen, können Sie Real_Query verwenden, kann aber auch zu einer Sicherheitsanfälligkeit bei der SQL -Injektion werden, wenn die Benutzereingabe nicht korrekt verarbeitet wird. Daher müssen Sie bei der Verwendung von Real_Query besonders vorsichtig sein.
<?php
$conn = new mysqli("localhost", "username", "password", "database");
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT * FROM users WHERE username = '".$_GET['username']."'";
if ($conn->real_query($sql)) {
$result = $conn->use_result();
while ($row = $result->fetch_assoc()) {
echo "Username: " . $row['username'];
}
}
?>
Im obigen Code verwendet die SQL Query -Anweisung die Benutzereingabe von $ _get ['Benutzername'] direkt. Wenn der Benutzer einen böswilligen SQL -Code wie 'oder 1 = 1 - eingibt, führt er zu SQL -Injektionsangriffen. Daher muss die Benutzereingabe vor der Ausführung von Real_Query verarbeitet werden.
Eine der effektivsten Möglichkeiten zur Verhinderung der SQL -Injektion ist die Verwendung vorbereiteter Aussagen . Durch Vorverarbeitungsanweisungen werden SQL -Anweisungen und Daten getrennt, und die Datenbank -Engine verarbeitet die Daten als Normalwerte, ohne sie in SQL -Code zu analysieren. Dies kann leicht mit der MySQLI -Erweiterung von PHP erreicht werden.
<?php
$conn = new mysqli("localhost", "username", "password", "database");
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $_GET['username']);
if ($stmt->execute()) {
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo "Username: " . $row['username'];
}
}
?>
In diesem Beispiel kompiliert die Funktion zuerst die SQL -Abfrage, und die Funktion BIND_PARAM bindet die Benutzereingabe an die Parameter in der Abfrage ( ? ). Auf diese Weise werden die vom Benutzer eingegebenen Daten als einfacher Text verarbeitet, wodurch SQL -Injektionsangriffe vermieden werden.
Wenn Sie Real_Query verwenden müssen, müssen Sie darauf achten, den Benutzereingaben manuell zu entkommen, um sicherzustellen, dass die Eingabe keinen böswilligen Code enthält. MySQLI bietet die Funktion real_escape_string , um Sonderzeichen in einer Zeichenfolge zu entkommen.
<?php
$conn = new mysqli("localhost", "username", "password", "database");
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$username = $conn->real_escape_string($_GET['username']);
$sql = "SELECT * FROM users WHERE username = '$username'";
if ($conn->real_query($sql)) {
$result = $conn->use_result();
while ($row = $result->fetch_assoc()) {
echo "Username: " . $row['username'];
}
}
?>
Mit Real_escape_String können wir den Sonderzeichen in der Benutzereingabe entkommen, um zu vermeiden, dass ein bösartiger SQL -Code ausgeführt wird. Obwohl dieser Ansatz das Risiko einer SQL -Injektion verringern kann, kann er nicht vollständig vermieden werden. Daher wird empfohlen, zuerst Vorverarbeitungsanweisungen zu verwenden.
Zusätzlich zur Verwendung von Real_Query- und Vorverarbeitungsanweisungen gibt es einige zusätzliche Sicherheitsmaßnahmen, die das Risiko einer SQL -Injektion verringern können:
Verwenden von PDO (PHP -Datenobjekte) : PDO unterstützt auch Vorverarbeitungsanweisungen und ist flexibler als MySQLI , geeignet für eine Vielzahl von Datenbanken.
Minimieren Sie die Datenbankberechtigungen : Stellen Sie sicher, dass Datenbankbenutzer nur Berechtigungen haben, um die erforderlichen Vorgänge auszuführen, den Zugriff auf die Datenbank zu begrenzen und die potenzielle Sabotage -Fähigkeit von Angreifern zu verringern.
RECHTE UPDATE UND PLATZE : Überprüfen und aktualisieren Sie regelmäßig PHP-, MySQL- und Server -Umgebungen, um sicherzustellen, dass alle Sicherheitslücken festgelegt werden.
Aktivieren Sie die Webanwendungs -Firewall (WAF) : WAF kann Angriffe wie die SQL -Injektion erkennen und abfangen und ist eine wichtige Barriere für das Schutzsystem.
Die SQL -Injektion ist einer der häufigsten Webangriffe, und PHP -Entwickler müssen effektive Maßnahmen ergreifen, um die Sicherheit der Datenbank zu gewährleisten. Durch korrekte Verwendung von Real_Query- und Vorverarbeitungsanweisungen kann das Risiko einer SQL -Injektion effektiv verhindert werden. Darüber hinaus sollten Entwickler auch andere Sicherheitsmaßnahmen wie Eingabeüberprüfung, Datenbankberechtigungsverwaltung und Sicherheits -Patch -Updates kombinieren, um die Gesamtsicherheit des Systems zu verbessern.
Verwandte Tags:
SQL