[ Zamknij ] [ pdf ] [ xlsx ]
Nazwa szkoleniaTermin odTermin doMiejscowośćFirma / ZleceniodawcaGodzin
Wykładowca na kierunku Programowanie aplikacji internetowych i mobilnych, przedmiot język PHP 2018-03-032018-03-23Krakówteb.pl40
Wykładowca w Szkole programowania codeskills.pl (sem. II, zakres Back-End Developer)2018-02-242018-06-24Warszawacodeskills.pl120
Wykładowca na kierunku Programowanie aplikacji internetowych i mobilnych, przedmiot język HTML5 oraz CSS3.2017-10-142017-12-10Krakówteb.pl40
Kurs Front End Developer, moduł JavaScript (podstawy JS, model DOM, jQuery, AJAX).2017-07-132017-07-18KrakówAkademia108.pl32
MS Excel - obsługa programu od podstaw.2017-06-052017-06-06KrakówEduKey Łódź.12
Kurs programowania (forma bootcampu) - moduł: wprowadzenie do programowania (HTML5, CSS3, JavaScript, jQuery, AJAX, JSON), moduł: specjalizacja back-end (PHP, SQL, MySQL).
[ szczegóły ]
2017-03-062017-04-07Warszawacodeskills.pl184
Kurs programowania (forma bootcampu) - moduł: wprowadzenie do programowania (html5, CSS3, JavaScript, jQuery, AJAX, PHP, JSON, SQL, MySQL).
[ szczegóły ]
2016-11-072016-11-28Warszawacodeskills.pl104
Przygotowanie materiałów oraz przeprowadzenie szkolenia: System Linux - podstawowa administracja LX-02.
[ szczegóły ]
2016-10-122016-10-14WarszawaAction Centrum Edukacyjne Warszawa.24
Przygotowanie programu, materiałów oraz przeprowadzenie szkolenia „Praktyczny kurs programowania” w ramach projektu „MOJA STREFA WPŁYWU: program zwiększania zatrudnienia osób młodych na dolnośląskim rynku pracy”. Tematyka: PHP, JAVA, bazy MySQL. Szkolenie w standardzie ECCC.2016-08-232016-09-02Wrocław.HUMANEO, Nowy Sącz.64
Przygotowanie programu, materiałów oraz przeprowadzenie szkolenia „Pracownik IT” w ramach projektu „MOJA STREFA WPŁYWU: program zwiększania zatrudnienia osób młodych na dolnośląskim rynku pracy”. Tematyka: HTML5, CSS3, JavaScript, PHP, MySQL. Szkolenie w standardzie ECCC. 2016-05-242016-06-09Wrocław.SENSE consulting sp. z o.o. - Poznań.64
Przygotowanie programu, materiałów oraz przeprowadzenie szkolenia Excel moduł podstawowy (9 grup x 8h zegarowych = 72h), moduł średniozaawansowany (11 grup x 8h zegarowych = 88h), moduł zaawansowany (3 grupy x 8h = 24h).2016-05-232016-11-14Kraków.Aterima Kraków (szkolenie wewnętrzne pracowników).184
Kurs programowania stron internetowych.2016-02-242016-03-24KrakówGoWork.pl120
Excel zaawansowany (szkolenie autorskie).2015-12-152015-12-16Nowy SączCSD "KREATOR" (szkolenie wewnętrzne).16
Administracja i obsługa baz danych MySQL oraz PostgreSQL (szkolenie autorskie).2013-09-272013-10-17BrzeskoCentrum Szkoleniowo-Wdrożeniowe PNP Controls Bielsko Biała50
Kurs programowania stron internetowych.2013-08-032013-09-22Kraków.GoWork.pl120
Kurs programowania stron internetowych.2013-06-222013-08-18KrakówGoWork.pl120
Kurs programowania stron internetowych.2013-05-112013-06-23Kraków.GoWork.pl120
Kurs programowania stron internetowych.2012-12-152013-02-03Kraków.GoWork.pl120
Obsługa programu Excel - poziom podstawowy2012-12-012012-12-02Kraków.GoWork.pl16
Obsługa programu Excel - poziom podstawowy2012-10-222012-10-25Kraków.GoWork.pl26
Administracja serwerem INTERNETOWYM i INTRANETOWYM z systemem Linux.2012-09-012012-11-30Brzesko.Centrum Szkoleniowo-Wdrożeniowe PNP Controls Bielsko Biała (szkolenie autorskie).90
MS Word - poziom podstawowy.2012-09-012012-09-01Kraków.GoWork.pl6
Obsługa programu Word + Excel - poziom średniozaawansowany.2012-07-192012-07-20KrakówGoWork.pl16
Obsługa programu Word + Excel - poziom średniozaawansowany.2012-07-112012-07-12KrakówGoWork.pl16
Obsługa programu Excel - poziom zaawansowany2012-05-192012-05-20KrakówGoWork.pl16
Obsługa programu Excel - poziom podstawowy2012-05-122012-05-13Kraków.GoWork.pl16
Kurs komputerowy podstawowy (obsługa systemów operacyjnych, Internet, Word, Excel). 2011-07-022011-08-04Miechów.GOPS Miechów.120
Serwerowe systemy operacyjne - Linux, Windows, Novell NetWare.2010-10-202010-11-26Miechów.AdlerComputers.90
Pracownik administracyjno - biurowy. Moduł "Obsługa komputera".2010-05-052010-05-24Gdów.Stowarzyszenie Inspiracje - Mielec.46
Pracownik biurowy - sekretarka, moduł "Obsługa komputera w sekretariacie, obsługa urządzeń biurowych".2009-10-152009-10-30Miechów.Grupa Doradcza Projekt - Kraków.84
Sprzedawca - moduł "Obsługa komputera".2009-09-282009-10-09Miechów.Grupa Doradcza Projekt - Kraków.60
Moduł "Obsługa komputera" w ramach kursu "Sprzedawca".2009-05-252009-06-05Miechów.Grupa Doradcza Projekt - Kraków.60
Obsługa komputera, kas fiskalnych, fakturowanie - moduł "Obsługa komputera".2008-11-272008-12-09Miechów.Grupa Doradcza Projekt - Kraków.50
Obsługa komputera z aktywnym poszukiwaniem pracy.2008-10-272008-11-10Miechów.Grupa Doradcza Projekt - Kraków.60
Łączna ilość godzin: 2306.

PHP -> Wstrzykiwanie kodu SQL (SQL injection)


Dodał / zmodyfikował: pkania, w dniu:2016-03-30

W tym artykule przyjrzymy się zagadnieniom związanym z atakami SQL injection (wstrzykiwanie kodu SQL). Na początku przeanalizujemy konkretne przypadki, aby zrozumieć mechanizm działania tego zagrożenia. Następnie zastanowimy się jak temu zapobiegać wg zasady "lepiej zapobiegać niż leczyć".

Załóżmy, że mamy pewien system logowania (oparty na dwóch kontrolkach formularza o nazwach login oraz password). Takie same pola znajdują się w tabeli users w naszej bazie danych np. MySQL. Tabela może się składać z następujących kolumn: id | login | password | mail

Osoba chcąca się zalogować do naszego serwisu musi więc podać swój login oraz hasło wcześniej zapisane w w/w tabeli np. podczas zakładania konta. Teraz my (mówiąc w skrócie) musimy przyjąć pewne dane od użytkownika i porównać je z tymi zapisanymi w bazie. Zazwyczaj więc odbieramy te dane, przypisujemy do zmiennych i "osadzamy" w odpowiednich miejscach konstruowanego zapytania SQL. Fragment kodu PHP może więc wyglądać następująco:

$login=$_POST['login'];

$password=sha1($_POST['password']);

$query="select * from `users` where `login`='$login' and `password`='$password'";

Załóżmy, że ktoś podał w polu login wartość "jarek", a w polu password "tajne1234". Zapytanie SQL (przechowywane w zmiennej $query) będzie miało zatem następującą postać:

select * from `users` where `login`='jarek' and `password`='zahashowany_ciag_podanych_znakow';

I wszystko OK, zapytanie się wykona. W dalszej części skryptu sprawdzimy, czy wynik dał pozytywny rezultat (tzn. czy w bazie istnieje użytkownik o danym loginie i haśle) i na tej podstawie podejmiemy decyzję o pomyślnym zalogowaniu, czy też nie...

Ale ... jeżeli ktoś zna choćby podstawy języka SQL, to wie, że np. dwa znaki myślnika (--) w tym języku oznaczają komentarz. Może to zatem wykorzystać w naszym skrypcie logowania ! Ale jak ! Przecież kod PHP wykonuje się po stronie serwera, a nam zwraca tylko to, co otrzyma od parsera. Tu nic się nie zmieniło, dalej zasada wykonywania skryptów pozostanie niezmienna. Natomiast "sprytny" użytkownik może próbować wpisać następujący ciąg znaków do pola formularza o nazwie login: cos' OR 1=1 -- czyli: napis_cos apostrof spacja OR 1=1 spacja -- spacja. W tym momencie nasze zapytanie wewnąt skryptu (zmienna $query) przyjmie następującą postać:

select * from `users` where `login`='cos' OR 1=1 -- `password`='zahashowany_ciag_podanych_znakow';

Co się zatem stało ? Zalogowaliśmy się na pierwszego użytkownika z naszej tabeli nie znając nawet jego loginu, nie mówiąc już o haśle... Tak zmodyfikowaliśmy zapytanie SQL (to co wstrzyknięto w zapytanie celowo zaznaczyłem na zielono), że jedna jego część dała rezultat true (OR 1=1). Dalsza część zapytania nie jest brana pod uwagę, ponieważ zostanie potraktowana jako komentarz. To jeszcze nie wszystko. Tym sposobem uda nam się zalogować tylko na pierwszego użytkownika z tabeli users.

A co jeśli znamy login któregokolwiek z użytkowników ? Czy zalogowanie na jego konto bez podania hasła będzie możliwe ? Spróbujmy tym razem w polu formularza login wpisać następującą frazę: jarek' -- , czyli: znany_login_uzytkownika apostrof spacja -- spacja

I jak ? udało się zalogować na konto Jarka ? Pewnie, że tak. Tym razem zapytanie przedstawia się następująco:

select * from `users` where `login`='jarek' -- `password`='zahashowany_ciag_podanych_znakow';

Jak już zapewne zauważyłeś i tym razem druga część zapytania nie jest brana pod uwagę, a jego pierwsza część zwróci wynik true... (oczywiści jeżeli takie konto w bazie danych istnieje).

I jeszcze jeden przykład. Zakładam, że dowiedziałeś się jaką nazwę posiada jedna z kolumn tabeli users. Powiedzmy, że jest to kolumna o nazwie id. W tym momencie można spróbować wpisać w polu login następujący ciąg znaków: cos' OR id=3 -- ,czyli: napis_cos apostrof spacja OR spacja id=3 spacja -- spacja. Teraz nasze zapytanie wygląda tak:

select * from `users` where `login`='cos' OR id=3 -- `password`='zahashowany_ciag_podanych_znakow';

Jeżeli chodzi o wytłumaczenie tego zapytania odsyłam Cię do pierwszego przykładu z tego artykułu. Finał tego zapytania będzie taki, że zalogujemy się na użytkownika o id=3.

Jak widzisz przeprowadzenie ataków tego typu nie jest zbyt skomplikowane. We wspomnianych przykładach nawet nie starałem się użyć jakiś wysublimowanych sposobów, a mimo to nasz skrypt okazał się dziurawy jak druszlak :) Strach pomyśleć, co by się stało, gdybym próbował użyć innych sposobów "oszukania" zapytania (podmiany znaków itd...). Lepiej może się nad tym już nie zastanawiać :)

Zajmijmy się teraz obroną przed tego typu atakami !

Najważniejsza zasada brzmi: nigdy nie ufaj temu, co otrzymujesz (pobierasz) od użytkownika !

W tej sytuacji z pomocą przychodzą funkcje wbudowane, które walidują (sprawdzają) poprawność otrzymanych danych oraz / lub funkcje sanityzujące (oczyszczające, odkażające) otrzymane dane. Oczywiście nikt Ci nie każe korzystać z funkcji wbudowanych. Możesz napisać własną funkcję sprawdzającą, czy np. w przekazywanych danych istnieją jakiekolwiek niedozwolone znaki itp. Niemniej jednak w PHP już istnieje wachlarz funkcji gotowych do ew. wykorzystania we własnych projektach. Opis wspomnianych funkcji odnajdziesz na stronie: http://php.net/manual/en/filter.filters.php

Ponadto przy budowaniu zapytań możemy skorzystać z połączenia dwóch funkcji sprintf oraz mysqli_real_escape_string

W tym przypadku składnia zapytania może wyglądać następująco:

$zapytanie=sprintf("select * from `user` where `login`='%s' and `password`='%s' LIMIT 1;", mysqli_real_escape_string($db,$uzytkownik), mysqli_real_escape_string($db,$pass)));

gdzie $db jest "uchwytem" do połaczenia z bazą danych (za pomocą mysqli). W wypadku używania obiektów zapis może się przedstawiać następująco:

$user=new sqlQuery;
$user->myQuery(sprintf("select * from `user` where `login`='%s' and `password`='%s' LIMIT 1;", mysqli_real_escape_string($user->db,$uzytkownik), mysqli_real_escape_string($user->db,$pass)));