PHP. Bezpieczne programowanie.pdf

(202 KB) Pobierz
PHP. Bezpieczne programowanie
IDZ DO
PRZYK£ADOW Y ROZDZIA£
PHP. Bezpieczne
SPIS TREŒCI
programowanie
KATALOG KSI¥¯EK
Autor: Chris Shiflett
T³umaczenie: S³awomir Dzieniszewski
ISBN: 83-246-0425-1
Tytu³ orygina³ u: Essential PHP Security
Format: B5, stron: 128
KATALOG ONLINE
ZAMÓW DRUKOWANY KATALOG
TWÓJ KOSZYK
DODAJ DO KOSZYKA
Bezpieczeñstwo danych w sieci to temat, który jest ostatnio poruszany niezwykle
czêsto. Serwery internetowe zajmuj¹ce siê przetwarzaniem transakcji elektronicznych,
wyœwietlaniem stron WWW i przesy³aniem danych sta³y siê ulubionym celem ataków
komputerowych przestêpców. Kluczowym zagadnieniem jest wiêc bezpieczeñstwo
aplikacji dzia³aj¹cych na tych serwerach. Aplikacje napisane w najpopularniejszym
jêzyku, w PHP, stanowi¹ dla hakerów ³akomy k¹sek. Nie jest to jednak wina jêzyka,
a raczej twórców aplikacji, którzy w projektach nie uwzglêdniaj¹ mechanizmów
obronnych.
Ksi¹¿ka „PHP. Bezpieczne programowanie” zawiera przegl¹d metod pozwalaj¹cych na
ochronê aplikacji internetowych przed ró¿nymi rodzajami ataków. Czytaj¹c j¹, nauczysz
siê projektowaæ bezpieczne formularze, zapobiegaæ przechwytywaniu informacji z baz
danych oraz zabezpieczaæ mechanizmy sesji. Dowiesz siê, w jaki sposób uchroniæ siê
przed kradzie¿¹ danych oraz uniemo¿liwiæ atak polegaj¹cy na wstrzykiwaniu poleceñ
i kodu SQL. Poznasz tak¿e ogólne zasady ochrony kodu Ÿród³owego.
Ataki na formularze
Zabezpieczanie przed wykonywaniem skryptów
Ochrona baz danych
Zabezpieczanie mechanizmów sesji i danych logowania
Uniemo¿liwianie uruchamiania obcych aplikacji
Ochrona systemu plików na serwerze
Utrzymywanie aplikacji na wspó³dzielonym serwerze i eliminowanie
zwi¹zanych z tym zagro¿eñ
Poznaj ró¿ne rodzaje ataków i stwórz mechanizmy obronne
CENNIK I INFORMACJE
ZAMÓW INFORMACJE
ONOWOŒCIACH
ZAMÓW CENNIK
CZYTELNIA
FRAGMENTY KSI¥¯EK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
119562176.004.png 119562176.005.png 119562176.006.png 119562176.007.png
Przedmowa ..................................................................................................................... 5
O książce ......................................................................................................................... 7
1. Wprowadzenie .............................................................................................................. 11
Funkcje języka PHP
12
Strategie
14
Dobre praktyki
17
2. Formularze i adresy URL ............................................................................................... 25
Formularze i dane
25
Ataki semantyczne na adresy URL
28
Ataki związane z ładowaniem plików
30
Ataki typu cross-site scripting
33
Ataki typu CSRF
34
Podrabiane zatwierdzenia formularza
38
Sfałszowane żądania HTTP
39
3. Bazy danych i SQL ......................................................................................................... 43
Ujawnienie uwierzytelnień dostępu
44
Wstrzykiwanie kodu SQL
45
Ujawnienie danych przechowywanych w bazie
50
4. Sesje i cookie ..................................................................................................................51
Kradzież cookie
53
Ujawnienie danych sesji
54
Zafiksowanie sesji
54
Przechwytywanie sesji
58
3
119562176.001.png
5. Pliki dołączane do programów .................................................................................... 61
Ujawnienie kodu źródłowego
61
Adresy URL otwierające tylne drzwi
63
Manipulowanie nazwą pliku
63
Wstrzykiwanie kodu
65
6. Pliki i polecenia ............................................................................................................. 67
Trawersowanie katalogów
67
Zagrożenia związane z plikami zdalnymi
69
Wstrzykiwanie poleceń
71
7. Uwierzytelnianie i autoryzacja .................................................................................... 73
Łamanie zabezpieczeń metodą brutalnej siły
74
Podsłuchiwanie haseł
77
Ataki metodą powtórzenia
78
Trwały login
79
8. Na wspólnym hoście ..................................................................................................... 85
Ujawnienie kodu źródłowego
85
Ujawnienie danych sesji
88
Wstrzykiwanie sesji
91
Przeglądanie systemu plików
93
Bezpieczny tryb języka PHP
94
A Dyrektywykonfiguracyjne........................................................................................... 97
B Funkcje......................................................................................................................... 103
C Kryptografia ................................................................................................................ 109
Skorowidz .................................................................................................................... 115
4
Spis treści
ROZDZIAŁ 3.
Bardzo często kod PHP wykorzystywany jest jako połączenie między różnymi źródłami da-
nych a użytkownikiem. Prawdę powiedziawszy, niektórzy twierdzą, że język PHP jest raczej
platformą programową niż zwykłym językiem programowania. Jest on na przykład bardzo
często wykorzystywany do komunikacji z bazą danych.
Język PHP jest dobrze przystosowany do tej roli głównie z uwagi na to, że potrafi się kon-
taktować z długą listą różnych baz danych. Oto tylko kilka najbardziej popularnych systemów
baz danych, które język PHP obsługuje:
DB2
ODBC
SQLite
InterBase
Oracle
Sybase
MySQL
PostgreSQL
DBM
Tak jak jest w przypadku każdego zewnętrznego miejsca składowania danych, tak i bazy da-
nych niosą ze sobą pewne ryzyko. Mimo iż w niniejszej książce nie zajmujemy się bezpieczeń-
stwem baz danych, powinniśmy pamiętać, że pisząc aplikacje WWW, należy mieć na wzglę-
dzie problemy związane z bezpieczeństwem baz danych, w szczególności w sytuacjach, kiedy
należy traktować dane otrzymywane z bazy danych jako dane zewnętrzne (dane wejściowe).
Tak jak wspomniałem w rozdziale 1., wszelkie dane wejściowe powinny być filtrowane, a wszel-
kie dane zwracane (dane wyjściowe) powinny być opatrywane odpowiednimi znakami ucieczki.
W odniesieniu do komunikacji z bazami danych będzie to oznaczać, że wszystkie dane nad-
chodzące z bazy danych muszą być filtrowane, a wszelkie dane wysyłane do bazy muszą być
opatrzone znakami ucieczki.
Jeden z typowych błędów polega na zapominaniu, że zapytanie SELECT również
wysyła dane do bazy danych. Mimo iż jego zadaniem jest pobieranie danych, samo
jednak zawiera dane wyjściowe wysyłane przez aplikacje.
Wielu programistów PHP zapomina o konieczności filtrowania danych nadchodzących z ba-
zy danych, ponieważ w bazie przechowywane są zazwyczaj wyłącznie dane już przefiltro-
wane. Mimo iż ryzyko związane z tym zaniedbaniem nie jest duże, ja jednak zalecałbym, aby
nie ułatwiać sobie w ten sposób życia. Podejście to bowiem pokłada zbyt wielkie zaufanie
w bezpieczeństwie bazy danych, a ponadto łamie zasadę tworzenia w miarę możliwości do-
datkowych zabezpieczeń. Należy pamiętać, że wprowadzanie takich dodatkowych zabezpieczeń
43
119562176.002.png 119562176.003.png
wzmacnia ogólne bezpieczeństwo aplikacji i komunikacja z bazą danych jest znakomitym
przykładem korzyści płynących z zaimplementowania dodatkowych mechanizmów ochron-
nych. Jeśli komuś uda się w jakiś sposób wprowadzić do bazy danych niebezpieczne dane, to
odpowiedni mechanizm filtrowania danych w aplikacji je wyłapie, pod warunkiem oczywiście,
że będzie istniał.
W niniejszym rozdziale przyjrzymy się paru problemom związanym z bezpieczeństwem
komunikacji z bazami danych, między innymi ujawnieniu uwierzytelnień dostępu czy wstrzy-
kiwaniu kodu SQL. Szczególną uwagę należy zwrócić właśnie na wstrzykiwanie kodu SQL
z uwagi na to, że często wykrywa się w popularnych aplikacjach PHP podatność na takie ataki.
Ujawnienie uwierzytelnień dostępu
Jednym z ważnych problemów związanych z korzystaniem z baz danych jest niebezpieczeń-
stwo ujawnienia uwierzytelnień umożliwiających dostęp do bazy danych — czyli nazwy
użytkownika i hasła. Często są one dla wygody zachowywane w pliku takim jak db.inc:
<?php
$db_user = 'myuser';
$db_pass = 'mypass';
$db_host = '127.0.0.1';
$db = mysql_connect($db_host, $db_user, $db_pass);
?>
Zarówno nazwa użytkownika myuser , jak i hasło mypass są szczególnie ważne dla bezpie-
czeństwa bazy danych i aplikacji, dlatego też należy zwrócić na nie szczególną uwagę. Umiesz-
czanie ich w kodzie źródłowym wiąże się z pewnym ryzykiem, którego jednak raczej nie da
się uniknąć. Bez nich nasza baza danych nie mogłaby być chroniona za pomocą nazwy użyt-
kownika i hasła.
Jeśli przyjrzymy się plikowi httpd.conf (standardowemu plikowi konfiguracyjnemu serwera
WWW Apache), przekonamy się, że domyślny typ zawartości zdefiniowany został tam jako
text/plain . Ustawienie takie jest szczególnie niebezpieczne, gdy plik z hasłami, taki jak
db.inc, jest przechowywany w katalogu dokumentów WWW. Każdemu dokumentowi prze-
chowywanemu w katalogu dokumentów WWW przypisany zostaje bowiem odpowiedni adres
URL i ponieważ serwer Apache nie określa zazwyczaj specjalnego typu zawartości dla pli-
ków .inc, więc każde żądanie tego rodzaju zasobu zwróci plik z hasłami w postaci zwykłego
pliku tekstowego (domyślny typ zawartości). W ten sposób żądający bez trudu uzyska do-
stęp do uwierzytelnień dostępu bazy danych.
Aby lepiej wyjaśnić zagrożenia związane z taką sytuacją, załóżmy, że mamy serwer WWW,
w którym dokumenty przechowywane są w katalogu /www. Jeśli plik db.inc będzie przecho-
wywany w podkatalogu www/inc, to otrzyma własny adres URL — http://example.org/inc/dbinc
(zakładając, że adres internetowy hosta serwera WWW to example.org). Zaglądając pod ten
adres URL, użytkownik będzie mógł obejrzeć kod źródłowy pliku db.inc w postaci zwykłego
tekstu (jak to określa domyślny typ zawartości). Dlatego też, jeśli plik db.inc przechowywany
jest w którymkolwiek z podkatalogów katalogu dokumentów /www, zawsze istnieje ryzyko
ujawnienia uwierzytelnień dostępu osobom niepowołanym.
44
Rozdział 3. Bazy danych i SQL
Zgłoś jeśli naruszono regulamin