search check home clock-o tag tags chevron-left chevron-right chevron-up chevron-down twitter facebook github rss comment comments terminal code

[PHP] Bezpieczeństwo stron WWW – Jak się zabezpieczać?

Czym jest PHP?

PHP jest najpopularniejszym językiem webmasterów dzięki jego łatwości uczenia się oraz wielkim możliwościom jakie daje ten język.Ponadto składa się z nieskomplikowanej składni.

Od tego języka najczęściej zaczynają się pierwsze kroki w poważnym tworzeniu stron WWW. Współpracuje z serwerami typu Apache i bazami danych MySQL, które są open source'owe.

Dużym problemem wielu programistów jest bezpieczeństwo kodu. Niezabezpieczony kod jest powszechnie spotykany na stronach z PHP, ponieważ często pojawiają się jakieś przeoczenia w kodzie lub po prostu programiści idą na łatwiznę nie interesując się nim.

Takie dziury w kodzie są łakomym kąskiem dla hackerów, którzy uwielbiają znajdywać je. Tym bardziej, że nie są trudne do znalezienia. Dlatego bardzo ważne jest to by znaleźć te luki samemu, zanim ktokolwiek inny je znajdzie i wykorzysta na naszą niekorzyść.

Typy ataków

Istnieje wiele różnych typów ataków na strony z PHP. Pierwszymi z nich są ataki wykonane przez ludzi, drugie to ataki automatyczne. Obydwa typy mogą potencjalnie zniszczyć stronę.

Ataki wykonane przez ludzi to bezpośredni dostęp do kodu strony, który mogą zmodyfikować.

Natomiast ataki automatyczne są szczególnie niebezpieczne z tego powodu, że mogą: spowolnić działanie strony, dostać się do logów o błędach, manipulować kodem źródłowym czy zmieniać treść wiadomości na stronach.

Najczęściej występującymi postaciami tego typu ataków są wirusy i robaki internetowe.

Poznaliśmy typy ataków, to jak więc się przed nimi zabezpieczyć?

Register_Globals

Register_Globals ułatwia pisanie kodu aplikacji PHP programistom, ale także stwarza potencjalne ryzyko braku bezpieczeństwa kodu.

Te ustawienia są zawarte w pliku konfiguracyjnym PHP o nazwie php.ini, który może być włączony lub wyłączony. Kiedy jest włączony, to pozwala niezweryfikowanym osobom "wstrzyknąć" różne zmienne do kodu strony, dzięki czemu uzyskują dostęp do części administracyjnej do strony WWW.

Większość, jeśli nie wszyscy, eksperci do spraw bezpieczeństwa PHP zalecają wyłączenie register_globals.

Na przykład, w poniższym przykładzie użytkownik może dołączyć do końca linku URL strony: ?admin=1, aby łatwo dostać się do części administracyjnej strony, gdzie normalnie jest wymagane hasło.

if(isset($_POST['haslo']) && $_POST['haslo'] == "haslo")
{
	$admin=TRUE;
}

Dlatego dobrym zabezpieczeniem będzie jeśli przed powyższym kodem doda się:

$admin=FALSE;

Dzięki czemu tryb administratora jest domyślnie wyłączony.

Raportowanie błędów

Raportowanie błędów jest świetnym narzędziem diagnostycznym do wykrywania błędów i poprawiania ich szybko i łatwo, ale to także powoduje potencjalne ryzykow bezpieczeństwie.

Problem pojawia się w momencie gdy komunikaty o błędach są widoczne dla wszystkich, a nie tylko dla adminsitratora strony, dzięki czemu ktoś może wykorzystać tą wiadomość do włamania się do strony wykorzystując ujawnioną lukę.

Jeśli display_errors nie jest wyłączone lub ma wartość "0", to komunikaty błędów będą pokazywane przeglądarkach WWW, co nie jest zbyt dobre dla bezpieczeńtwa strony.

XSS, czyli Cross-Site Scripting

XSS jest sposobem hackerów na zdobywanie danych o użytkownikach Twojej strony poprzez podszywanie się pod stronę lub szkodliwy kod JavaScript, aby oszukać użytkownika lub przeglądarkę, by użył błędnego linka lub by podał swoje dane do logowania poprzez fałszywą stronę logowania, która zamiast logowania go, kradnie jego dane osobiste.

Najlepszym sposobem ochrony przed XSS jest wyłączenie JavaScriptu i obrazków w przeglądarce, ale wszyscy wiemy, ze to prawie niemożliwe, gdy wiele stron korzysta z JavaScriptu dla zwiększenia funkcjonalności swoich stron.

function safe($dane)
{
	htmlentities($dane, ENT_QUOTES, 'utf-8');
	//dalsze wykonanie funkcji
	return $dane;
}
//pobieranie $tytul i $wiadomosc z wprowadzonych danych przez użytkownika
$tytul=$_POST['tytul'];
$wiadomosc=$_POST['wiadomosc'];
//i wyświetlanie ich w bezpieczny sposób
print  '
<h1>'.safe($tytul).'</h1>
 
'.safe($wiadomosc).'
 
';

To jest prosty kawałek kodu, który zapobiega wpisanie kodu HTML i JavaScript do pól typu input, dzięki czemu na wyjściu mamy bezpieczną wersję danych wpisanych przez użytkownika.

Jest to szczególnie użyteczne przy mechanizmach komentarzy w blogach, formularzach i innych tego typu rzeczach, ktore wykorzystują dane wpisane przez użytkownika.

Zdalne dołączanie pliku (RFI)

Ten typ ataków jest stosunkowo nieznany wśród webdeveloperów, co powoduje szczególnie niszczycielskie zagrożenie dla bezpieczeństwa PHP.

Zdalne dołączanie pliku stosuje atak ze zdalnej lokacji, który wykorzystuje podatną na atak aplikację PHP i dołącza szkodliwy kod, który może się przyczynić do spammingu lub do uzyskania dostępu do folderu głównego na serwerze. Niezweryfikowany użytkownik uzyskując dostęp do jakiegokolwiek serwera może powodować duże zamieszanie na stronie WWW na wiele róznych sposobów, włączając w to zdobywanie informacji przechowywanych w bazie danych.

Zatem pytanie, jak to może wyglądać?

Wyobraź sobie że na stronie istnieje szkodliwy plik: http://www.strona.pl/plik.php, a kod naszej strony jest w http://www.moje.pl/index.php. Hacker tworzy taki link: http://www.moje.pl/index.php?page=http://www.strona.pl/plik.php wtedy taki plik ulega wykonaniu i tworzy się nowy plik na serwerze (ze szkodliwym kodem).

Najlepszym sposobem na ochronę Twojej storny przed tym atakiem jest ustawienie dyrektyw w php.ini - allow.url.fopen i allow_url_include.

Allow_url_fopen jest włączony domyślnie, a allow_url_include jest domyślnie wyłączony.

Narzędzia do sprawdzania bezpieczeństwa kodu PHP

  • PhpSecInfo - narzędzie raportujące na temat bezpieczeństwa kodu PHP. Podaje sugestie co do bezpieczeństwa.
  • PHP Security Scanner - narzędzie sprawdzające podatnosć kodu na ataki.
  • Spike PHP Security Audit Tool - kolejne narzedzie sprawdzające bezpieczeństwo kodu PHP

Podsumowując, te kilka informacji może Tobie pomóc w kwestiach bezpieczeństwa kodu PHP na stronie. Należy pamiętać, że sam kod PHP nie powoduje niebezpieczeństwa dla strony, lecz jego niedokładna implementacja.

  • W opisie zabezpieczania się przed XSS masz błąd w funkcji safe(); Spójrz na zmienną wchodzącą do funkcji i zwracaną. Nie $danr, lecz $dane.

  • dzięki za zwrócenie uwagi 🙂

  • Brakuje troszkę o sqj injection, fakt faktem jest to atak na bazę danych ale zabezpieczenia stosuje się już zwykle na poziomie PHP poza tym uczy dobrych nawyków.