Latest web development tutorials

SQLite Injektion

Wenn Sie Ihre Website-Benutzer zur Eingabe ermöglicht und die Eingabe in die SQLite-Datenbank, dieses Mal mit einem Sicherheitsproblem konfrontiert sind, wird als SQL-Injection bekannt. Dieses Kapitel zeigt Ihnen, wie dies zu verhindern, und die Sicherheits Skript SQLite Aussagen zu gewährleisten.

Injection tritt in der Regel, wenn eine Benutzereingabe anfordert, wie Benutzer den Namen eingeben muss, aber der Benutzer hat eine SQLite-Anweisung eingegeben, und diese Aussage wird in der Datenbank unbewusst ausgeführt werden.

Vertrauen Sie nie vom Benutzer gelieferten Daten, so dass nur validierte Datenverarbeitung, wird die Regel durch Musterabgleich durchgeführt. Im folgenden Beispiel wird der Benutzername Benutzername auf alphanumerische Zeichen oder Unterstrichen begrenzt, muss die Länge zwischen 8-20 Zeichen lang sein - je nach Bedarf, diese Regeln zu ändern.

if (preg_match ( "/ ^ \ w {8,20} $ /", $ _GET [ 'username'], $ matches)) {
   $ Db = new SQLiteDatabase ( 'Dateiname');
   Ergebnis $ = @ $ db-> query ( "SELECT * FROM users WHERE username = $ treffer [0]");
} Else {
   echo "Benutzername nicht akzeptiert";
}

Um dieses Problem zu demonstrieren, betrachten diese Hypothese Auszug: Um das Problem zu demonstrieren, betrachten diesen Auszug:

$ Name = "Qadir '; FROM Benutzer löschen";
@ $ Db-> query ( "SELECT * FROM users WHERE username = '{$ name}'");

Funktionsaufruf den Spaltennamen von dem Benutzernamen angegeben abzurufen passt den Datensatz aus der Benutzertabelle. Unter normalenUmständen enthält $ name nur alphanumerische Zeichen und Leerzeichen, wie String Ilia.Aber hier, auf $ name eine neue Abfrage hinzugefügt, die Anrufe an die Datenbank wird katastrophale Probleme verursachen: injiziert DELETE Abfrage alle Datensätze von Benutzern zu löschen.

Obwohl es nicht erlaubt, die Abfrage oder Datenbank-Schnittstelle Stapelung mehrerer Abfragen in einer einzigen Funktionsaufruf auszuführen, wenn Sie versuchen, die Abfrage zu stapeln, dann schlägt der Aufruf fehl, aber SQLite und PostgreSQL sind immer noch in der Abfrage gestapelt, die Ausführung in einer Saite Alle Anfragen, die ernste Sicherheitsprobleme verursachen können.

Verhindern, dass SQL-Injection

In Skriptsprachen wie Perl und PHP, können Sie gekonnt alle Escape-Zeichen verarbeiten. PHP bietetsqlite_escape_string String - Funktionen Programmiersprache ()für SQLite verwendet wird Sonderzeichen Eingabe zu entkommen.

if (get_magic_quotes_gpc ()) 
{
  $ Name = sqlite_escape_string ($ name);
}
Ergebnis $ = @ $ db-> query ( "SELECT * FROM users WHERE username = '{$ name}'");

Obwohl die Daten verschlüsselt, so dass der Einsatz sicher gemacht, aber es wird einfacher Textvergleich machen, in der Abfrage enthält die SpalteBinärdaten, LIKE - Klausel nicht zur Verfügung steht.

Bitte beachten Sie, dass addslashes () sollte nicht in SQLite Abfrage-String referenziert werden, wird es zu seltsamen Ergebnissen führen, wenn das Abrufen von Daten.