poniedziałek, 3 września 2018

SQL - Injection


SQL - Injection

Jeśli użytkownik wprowadzi dane przez stronę internetową i wstawi je do bazy danych SQL, istnieje szansa, że ​​pozostawiacie sobie szeroko otwarte problemy związane z bezpieczeństwem, znane jako SQL Injection. Ten rozdział nauczy Cię, jak temu zapobiec, i pomoże zabezpieczyć skrypty i instrukcje SQL w skryptach po stronie serwera, takich jak skrypty PERL.
Wstrzyknięcie zwykle występuje, gdy poprosisz użytkownika o dane wejściowe, takie jak jego nazwa, a zamiast nazwy podadzą ci instrukcję SQL, którą nieświadomie uruchomisz w bazie danych. Nigdy nie ufaj danym dostarczonym przez użytkownika, przetwarzaj te dane tylko po zatwierdzeniu z reguły odbywa się to za pomocą dopasowywania wzorców.
W poniższym przykładzie nazwa jest ograniczona do znaków alfanumerycznych plus podkreślenia i o długości od 8 do 20 znaków (w razie potrzeby zmodyfikuj te reguły).
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) {
   $result = mysql_query("SELECT * FROM KLIENCI
      WHERE nazwisko = $matches[0]");
} else {
   echo "brak akceptacji danych";
}
Aby zademonstrować problem, rozważ ten fragment -
// supposed input
$nazwisko = "Kowalczyk'; DELETE FROM KLIENCI;";
mysql_query("SELECT * FROM KLIENCI WHERE nazwisko='{$nazwisko}'");
Wywołanie funkcji ma na celu pobranie rekordu z tabeli KLIENCI, gdzie kolumna nazwisko pasuje do nazwy określonej przez użytkownika. W normalnych okolicznościach $nazwisko zawierałaby jedynie znaki alfanumeryczne i być może spacje, takie jak łańcuch znaków ilia. Ale tutaj, dołączając zupełnie nowe zapytanie do $nazwisko, wywołanie bazy danych zmienia się w katastrofę; wstrzyknięte zapytanie DELETE usuwa wszystkie rekordy z tabeli KLIENCI.
Na szczęście, jeśli używasz MySQL, funkcja mysql_query() nie zezwala na układanie zapytań lub wykonywanie wielu zapytań SQL w jednym wywołaniu funkcji. Jeśli spróbujesz przesłać zapytania, połączenie nie powiedzie się.
Jednak inne rozszerzenia baz danych PHP, takie jak SQLite i PostgreSQL, z powodzeniem wykonują skumulowane zapytania, wykonując wszystkie kwerendy podane w jednym ciągu i tworząc poważny problem bezpieczeństwa.

Zapobieganie iniekcji SQL

Możesz obsłużyć wszystkie znaki specjalne w językach skryptowych, takich jak PERL i PHP. Rozszerzenie MySQL dla PHP udostępnia funkcję mysql_real_escape_string() do unikania znaków wejściowych, które są specjalne dla MySQL.
if (get_magic_quotes_gpc()) {
   $name = stripslashes($name);
}
$nazwisko = mysql_real_escape_string($nazwisko);
mysql_query("SELECT * FROM KLIENCI WHERE nazwisko='{$nazwisko}'");

Problemy z LIKE

Aby rozwiązać dylemat LIKE, niestandardowy mechanizm ucieczki musi konwertować dostarczone przez użytkownika znaki "%" i "_" na literały. Użyj funkcji addcslashes(), która umożliwia określenie zakresu znaków, aby uciec.
$sub = addcslashes(mysql_real_escape_string("%str"), "%_");
// $sub == \%str\_
mysql_query("SELECT * FROM wiadomosc
   WHERE temat LIKE '{$sub}%'");


Brak komentarzy:

Prześlij komentarz