Wie man die SQL -Injektion in PHP verhindert

Wie man die SQL -Injektion in PHP verhindert

Dieses Tutorial hilft Ihnen dabei, SQL -Injekte in PHP zu verhindern. Überprüfen Sie zunächst in diesem Tutorial ein grundlegendes Beispiel für den SQL -Injektionsprozess. Wie können Benutzer Daten mithilfe der SQL -Injektion von Ihrer Website stehlen?? Dieses Tutorial umfasst auch Methoden zur Verhinderung der SQL-Injektion unter Verwendung von PHP-MYSQLI- und PHP-PDO-Treibern.

Einfaches SQL -Injektionsbeispiel

Zum Beispiel eine Website für die Bank haben. Sie haben Bankkunden eine Weboberfläche zur Verfügung gestellt, um ihre Kontonummer und ihren Kontostand anzuzeigen. Ihre Bankwebsite verwendet URL wie http: // Beispiel.com/get_account_details.Php?Account_id = 102 Details aus der Datenbank abrufen.

Zum Beispiel get_account_details.Php haben Code so etwas wie unten.

$ contoid = $ _get ['account_id']; $ query = "AccountNumber auswählen, Guthaben aus Konten, wobei Account = $ AccountID";
12$ contoid = $ _get ['Account_id']; $ query = "AccountNumber, Kontostand aus Konten, wobei Account = $ AccountID";

KundenkontoID werden als Account_ID über die Abfragezeichenfolge weitergeleitet. Wie oben URL, wenn die Konto -ID eines Benutzers 102 und es in der Abfragezeichenfolge übergeben wurde. Das PHP -Skript erstellt wie unten eine Abfrage wie unten.

$ query = "AccountNumber, Saldo aus Konten, wobei Account = 102";
1$ query = "AccountNumber, Saldo aus Konten, wobei Account = 102";
Details für ein bestimmtes Konto abgerufen.

Die Konto- und Guthabendetails sind für AccountID 102 abgerufen und Kunden wie in den oben genannten Screenshot zur Verfügung gestellt.

Nehmen wir ein weiteres Szenario an - ein übertroffener Kunde hat Account_ID als bestanden 0 oder 1 = 1 In Query -Zeichenfolge. Was wird jetzt geschehen sein? Das PHP -Skript erstellt eine Abfrage wie unten und wird in der Datenbank ausgeführt.

$ query = "AccountNumber, Kontostand aus Konten, wobei Account ID = 0 oder 1 = 1";
1$ query = "AccountNumber, Kontostand aus Konten, wobei Account ID = 0 oder 1 = 1";
Details für alle Konten abgerufen

Sehen Sie sich die Abfrage an, die von Skript und Ergebnis erstellt wurde, die von der Datenbank zurückgegeben wurde. Sie können sehen, dass diese Abfrage alle Kontennummer und den verfügbaren Guthaben zurückgegeben hat.

Dies wird als SQL -Injektion bezeichnet. Dies ist das einfache Szenario, es kann eine Reihe von Methoden zur Durchführung von SQL -Injektionen geben. Das folgende Tutorial hilft Ihnen dabei, die SQL -Injektion mit PHP MySQLI -Treiber und PHP -PDO -Treiber zu verhindern.

#1. Verwenden von PHP-MYSQLI-Treiber

Sie können mit PHP-MYSQLI-Treiber vorbereitete Aussagen ausgewiesen, um diese Art von SQL-Injektionen zu vermeiden. Verwenden Sie den folgenden PHP -Code, der die SQL -Injektion verhindert.

$ contoid = $ _get ['account_id']; if ($ stmt = $ mysqli-> vorbereiten ('AccountNumber auswählen, Guthaben aus Konten, wobei AccountID = ?')) $ stmt-> bind_param ("s", $ accode); $ stmt-> execute (); $ result = $ stmt-> get_result (); while ($ row = $ result-> fetch_assoc ()) // Mach hier etwas $ stmt-> close ();
12345678910111213141516$ contoid = $ _get ['account_id']; if ($ stmt = $ mysqli-> vorbereiten ('AccountNumber auswählen, Guthaben aus Konten, wobei AccountID = ?')) $ stmt-> bind_param ("s", $ accode); $ stmt-> execute (); $ result = $ stmt-> get_result (); while ($ row = $ result-> fetch_assoc ()) // Mach hier etwas $ stmt-> close ();

#2. Verwenden von PHP-PDO-Treiber

Sie können einen PHP-PDO-Treibervorbereitungsanweisungen verwenden, um diese Art von SQL-Injektionen zu vermeiden. Verwenden Sie den folgenden PHP -Code, der die oben genannten SQL -Injektionen auflöst.

$ contoid = $ _get ['account_id']; if ($ stmt = $ pdo-> prepect ('AccountNumber, Saldo aus Konten, wobei AccountID =: AccountID')) $ stmt-> execute (array ('name' => $ name)); foreach ($ stmt als $ row) // etwas hier etwas mach $ stmt-> close ();
123456789101112$ contoid = $ _get ['account_id']; if ($ stmt = $ pdo-> prepect ('AccountNumber, Kontostand aus Konten, wobei AccountID =: AccountID')) $ stmt-> execute (array ('name' => $ name)); foreach ($ stmt als $ row) // etwas hier etwas mach $ stmt-> close ();