środa, 19 września 2018

MySQL - SQL Injection


MySQL - SQL Injection

Jeśli przejdziesz przez proces  wprowadzania danych przez użytkownika i wstawisz je do bazy danych MySQL, istnieje szansa, że ​​staniesz się szeroko otwarty na problemy związane z bezpieczeństwem, znane jako SQL Injection. Ten rozdział nauczy Cię, jak temu zapobiec, i pomoże zabezpieczyć skrypty i instrukcje MySQL.
SQL Injection zazwyczaj pojawia się, gdy pytasz użytkownika o dane wejściowe, takie jak jego nazwa, a zamiast nazwy podajemy instrukcję MySQL, 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 poprzez dopasowanie do wzorca. W poniższym przykładzie nazwa użytkownika jest ograniczona do znaków alfanumerycznych plus podkreślenia i do długości od 8 do 20 znaków - w razie potrzeby zmodyfikuj te reguły.
if (preg_match("/^\w{8,20}$/", $_GET['nazwa_uzytkownika'], $matches)) {
   $result = mysql_query("SELECT * FROM uzytkownicy
                          WHERE nazwa_uzytkownika=$matches[0]");
} else  {
   echo "nazwa użytkownika nie została zaakceptowana";
}
Aby zademonstrować ten problem, rozważ następujący fragment.
// rzekome wejście
$nazwa = "Qadir'; DELETE FROM uzytkownicy;";
mysql_query("SELECT * FROM uzytkownicy WHERE nazwisko = '{$nazwa}'");
Wywołanie funkcji ma na celu pobranie rekordu z tabeli użytkowników, gdzie kolumna nazwy jest zgodna z nazwą określoną przez użytkownika. W normalnych okolicznościach zmienna $nazwa  zawierałaby jedynie znaki alfanumeryczne i być może spacje. Ale tutaj, dołączając zupełnie nowe zapytanie do $nazwa, wywołanie bazy danych zmienia się w katastrofę. Wstrzyknięte zapytanie DELETE usuwa wszystkie rekordy z tabeli użytkownicy.
Na szczęście, jeśli używasz MySQL, funkcja mysql_query() nie zezwala na układanie zapytań lub wykonywanie wielu zapytań 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 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);
}
$name = mysql_real_escape_string($name);
mysql_query("SELECT * FROM users WHERE name = '{$name}'");

Operator LIKE kłopoty

Aby rozwiązać dylemat z LIKE, niestandardowy mechanizm ucieczki musi przekonwertować 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("%cos_"), "%_");
// $sub == \%cos\_
mysql_query("SELECT * FROM wiadomosc WHERE temat LIKE '{$sub}%'");





Brak komentarzy:

Prześlij komentarz