Latest web development tutorials

wtrysku SQLite

Jeśli witryna pozwala użytkownikom na wejście i wejście do bazy danych SQLite, tym razem masz do czynienia z problemem bezpieczeństwa jest znany jako SQL injection. W tym rozdziale pokażemy, jak temu zapobiec i zapewnić bezpieczeństwo skryptu oświadczenia SQLite.

Wtrysk występuje zwykle w przypadku prośby o dane wprowadzone przez użytkownika, takie jak użytkownik musi wprowadzić nazwę, ale użytkownik wszedł w SQLite oświadczenie, a stwierdzenie to będzie działać na bazie nieświadomie.

Nigdy nie ufaj dane dostarczone przez użytkownika, więc tylko potwierdzone przetwarzanie danych, reguła jest wykonywana przez dopasowanie wzorca. W poniższym przykładzie nazwa użytkownika nazwa użytkownika jest ograniczona do znaków alfanumerycznych i podkreślenia, długość musi wynosić od 8-20 znaków - w zależności od potrzeb, aby zmodyfikować te zasady.

if (preg_match ( "/ ^ \ w {8,20} $ /", $ _GET [ 'username'], $ pasuje)) {
   $ Db = new SQLiteDatabase ( "nazwa_pliku");
   $ Result = $ db-> @ kwerendy ( "SELECT * FROM użytkowników WHERE username = $ matches [0]");
} Else {
   echo "nazwa użytkownika nie została przyjęta";
}

Aby zademonstrować ten problem, należy rozważyć tę hipotezę fragment: Aby zademonstrować ten problem, należy rozważyć ten fragment:

$ Nazwa = "Qadir"; DELETE FROM użytkowników ";
@ $ Db-> query ( "SELECT * FROM użytkowników WHERE username = '{$ nazwa}'");

Wywołanie funkcji w celu uzyskania nazwy kolumny podaną nazwą użytkownika dopasowuje rekord z tabeli użytkownika. W normalnychwarunkach, $ nazwa zawiera tylko znaki alfanumeryczne i przestrzenie, takie jak Ilia smyczkowych.Ale tu, do $ name dodania nowego zapytania, połączenia do bazy danych spowoduje katastrofalne problemy: wtrysk DELETE, aby usunąć wszystkie rekordy użytkowników.

Chociaż nie jest dopuszczalne, aby wykonać interfejs zapytań lub bazy układania wielu zapytań w jednym wywołaniu funkcji, jeśli starają się układać zapytanie, wtedy połączenie nie powiedzie się, ale SQLite oraz PostgreSQL nadal są ułożone w zapytaniu, który zapewnia wykonanie w ciągu znaków Wszystkie pytania, które mogą powodować poważne problemy związane z bezpieczeństwem.

Zapobieganie SQL injection

W językach skryptowych takich jak Perl i PHP, można umiejętnie obsługiwać wszystkie znakiem ucieczki. PHP udostępnia funkcje języka programowania ciągsqlite_escape_string () dla SQLite jest używany do ucieczki wejście znaki specjalne.

if (get_magic_quotes_gpc ()) 
{
  $ Nazwa = sqlite_escape_string ($ name);
}
$ Result = $ db-> @ kwerendy ( "SELECT * FROM użytkowników WHERE username = '{$ nazwa}'");

Chociaż dane są kodowane tak, że wkładka wykonana jest bezpieczne, ale będzie to proste porównanie renderowanie tekstu w zapytaniu, kolumna zawieradane binarne, podobnie jak klauzula nie jest dostępna.

Należy pamiętać, addslashes () nie powinna być uwzględniona w SQLite ciągu kwerendy, doprowadzi to do dziwnych wyników przy pobieraniu danych.