Translate: 
EnglishFrenchGermanItalianPolishPortugueseRussianSpanish

Code injection czyli prosty wirus PHP zapisany w obrazku JPEG

11 kwietnia 2011

Pracując jako programista i administrator usług w firmie hostingowej spotkałem się wielokrotnie z różnymi skryptami PHP obsługującymi galerie zdjęć lub download plików. O ile zazwyczaj mechanizm był podobny (polecenia typu file_get_contents(), fopen(), readfile()), to czasami zdarzały się mniej tradycyjne implementacje.

Do napisania tego artykułu natchnął mnie jeden użytkownik serwera, który zgłosił się do mnie z problemem wysyłania plików poprzez skrypt PHP. Niektóre pliki na jego stronie udawało się wysłać w całości, niektóre nie. Nie potrafił jednak dotrzeć do sedna sprawy.

Po krótkich oględzinach okazało się, że napisany przez niego skrypt oprócz pożądanej funkcjonalności posiadał także dodatkową: dzięki użyciu polecenia include() do odczytu obrazków, był podatny na code injection w języku PHP. Przeczytaj resztę tego wpisu »

UTF-8 i zła walidacja tekstu

11 kwietnia 2011

Jak dobrze wiadomo, słabą stroną języka PHP jest między innymi wsparcie dla bardzo popularnego w dzisiejszych czasach kodowania znaków w UTF-8. O ile w wersji 5.3 pojawiła się biblioteka ext/intl, to jednak większość istniejących mechanizmów walidacji tekstu opiera się wyłącznie na regułkach zapisanych w postaci wyrażeń regularnych. Mechanizm ten jest bardzo wygodny, lecz w przypadku znaków spoza alfabetu łacińskiego nie zawsze działa tak, jak programista to przewidział.

W skrajnych przypadkach użycie wyrażeń regularnych prowadzi to do bardzo ciekawych skutków ubocznych, które mogą negatywnie wpłynąć na bezpieczeństwo serwisu internetowego. Przeczytaj resztę tego wpisu »

Ciasteczka HttpOnly oraz Secure, czyli zabezpieczenia których nie ma

7 kwietnia 2011

Zgodnie z dokumentacją Microsoftu flaga HttpOnly przesłana w nagłówku HTTP Set-Cookie sprawia, że w przeglądarkach WWW obsługujących ten mechanizm skrypty JavaScript nie są w stanie odczytywać, ani modyfikować zawartości ciasteczka którego ten parametr dotyczył.

Podobnie działa mechanizm Secure, z tym że nie ukrywa on danych przed skryptami JS, lecz dotyczy rodzaju połączenia, przez które przesyłane jest ciasteczko. Jeśli zostało ono ustawione jako bezpieczne, przeglądarka WWW wyśle je do serwera jedynie wtedy, gdy połączenie jest szyfrowane (HTTPS).

Poniżej prezentuję prosty przykład w języku JavaScript łamiący częściowo te zabezpieczenia. Przeczytaj resztę tego wpisu »

Shared hosting: wykradanie ciasteczek HTTP

7 kwietnia 2011

  click here to see different articles in english

Serwery typu shared web hosting posiadają jedną wielką zaletę, w przeciwieństwie do serwerów dedykowanych założenie konta jest na nich bardzo tanie. Pozwala to na szybkie i bezproblemowe założenie niewielkiej strony internetowej, małego sklepu, czy też własnego portfolio bez większych nakładów finansowych.

Wiadomo jednak, że serwery te posiadają też i swoje mroczne strony, związane szczególnie z bezpieczeństwem.

W tym artykule skupię się na jednym z mniej znanych luk bezpieczeństwa – na wykradaniu ciasteczek HTTP pomiędzy różnymi kontami na tym samym serwerze. Przeczytaj resztę tego wpisu »

HipHop for PHP: Test wydajności – rewanż PHP

4 kwietnia 2011

W poprzednim artykule opisałem wydajność kompilatora HipHop for PHP przedstawiając wyniki sześciu testów PHP zaczerpniętych z serwisu shootout.alioth.debian.org. Nie był to jednak kompletny zestaw skryptów możliwych do zbadania.

Wspomniane testy zostały wtedy wyselekcjonowane w taki sposób, by uniknąć potencjalnych niekompatybilności związanych z kompilacją skryptu PHP do języka C++, które zostały opisane w dokumentacji HipHop for PHP. W przypadku wspomnianych skryptów problematyczne okazało się pobieranie danych wejściowych ze strumienia STDIN (testy: reverse-complement, regex-dna, k-nucleotide), oraz brak wsparcia dla biblioteki gmp (test pidigits).

Zgodnie z prośbą czytelników przedstawiam jednak wyniki dwóch kolejnych testów: regex-dna oraz k-nucleotide.
Przeczytaj resztę tego wpisu »

Pilnuj kodu swego…

1 kwietnia 2011

Black hatWpis ten dotyczy programistów, którzy w nazewnictwie własnych plików wyznają zasadę, że biblioteki PHP powinny nosić rozszerzenie *.php.inc, oraz osób, które z sobie tylko znanych powodów stosują inne warianty rozszerzeń (np. *.inc, *.asp lub *.phtml).

Choć moda na takie nazewnictwo przeminęła wiele lat temu wraz z niektórymi książkami uczącymi języka PHP, okazuje się jednak, że jest to nadal często spotykany proceder w Internecie.

Niestety jest to także jeden z podstawowych i najgroźniejszych błędów bezpieczeństwa. Przeczytaj resztę tego wpisu »

HipHop for PHP: Test wydajności

31 marca 2011

  click here for english version

Benchmark iconNa stronie shootout.alioth.debian.org znajduje się bardzo ciekawy benchmark porównujący ze sobą wydajność wielu różnych języków programowania. O ile daleki jestem od prowadzenia dyskusji na temat wyższości jednego języka nad drugim, uznałem, że ciekawie byłoby wykonać mały test prędkości pomiędzy PHP a… PHP (skompilowanym przy pomocy HipHop for PHP).

Mam nadzieję, że testy które przedstawiam poniżej okażą się pomocne w udzieleniu odpowiedzi, jak bardzo PHP przyspiesza po skompilowaniu, oraz czy HipHop for PHP jest faktycznie tak wydajny, jak twierdzą developerzy Facebooka. Przeczytaj resztę tego wpisu »

HipHop for PHP – Instalacja na Fedora 12 – 15

31 marca 2011

Minął już chyba rok, odkąd Facebook przedstawił publicznie swój wynalazek pozwalający na kompilowanie kodu PHP do plików binarnych.

Od początku swojego istnienia HipHop for PHP krytykowany był za problemy z konfiguracją oraz instalacją na różnych systemach operacyjnych. Choć sam Facebook oficjalnie wspiera swój produkt na systemach CentOS (darmowa wersja RedHata), oraz Fedora, to nawet na nich często instalacja kończyła się niepowodzeniem.

Z tego też powodu wsparty odpowiednią literaturą postanowiłem opisać dokładnie proces instalacji na jednym ze wspieranych przez Facebook dystrybucjach Linux, czyli na tytułowej Fedorze . Przeczytaj resztę tego wpisu »

UTF-8 w PHP 5.0+: Klasa String wzorowana na języku Java

30 marca 2011

Jak dobrze wiemy w PHP obsługa UTF-8 jest po dziś dzień dosyć skromna. Co prawda nie jest to cecha charakterystyczna wyłącznie dla tego języka (podobne problemy mają developerzy np. Ruby’ego), to w czasach, gdy większość stron WWW kodowanych jest w unikodzie, staje się to bolesną niedogodnością podczas developmentu.

Co prawda w wersji 5.3 pojawiła się nowa biblioteka ext/intl próbująca nadrobić opóźnienia w stosunku do reszty świata, jest to niestety zmiana prawie kosmetyczna, a nawet nieelegancka. Prawdziwa rewolucja miała nastąpić dopiero w PHP 6.0. Jako że ta wersja nie ujrzy już niestety światła dziennego, a programiści PHP 5.2, którzy z jakichś powodów nie mogą przesiąść się na wersję 5.3, skazani zostali na używanie zbioru różnych klas nie do końca sprawdzonych lub przemyślanych, postanowiłem że napiszę własną wzorując się na klasie String z języka Java. Przeczytaj resztę tego wpisu »

Zaawansowany mechanizm refleksji w PHP

28 marca 2011

Język PHP od wersji 5.0 posiada wbudowany mechanizm refleksji. Umożliwia on dokładne zbadanie dowolnego interfejsu, klasy, a nawet zwykłej funkcji.

Wśród opcji, jakie udostępniają nam twórcy PHP, znaleźć można funkcjonalności listujące właściwości klas, parametry przekazywane do ich metod, czy nawet numery linii, w których zawierają się deklaracje badanych elementów. Wydaje się, że mechanizm ten udostępnia kompletny zbiór operacji, jakie potrzebne są do rozłożenia dowolnego programu na czynniki pierwsze.

Po „zabawach” z Refleksjami oraz jej metodą getDocComment() poczułem jednak pewien niedosyt: skoro można pobrać treść komentarzy do metody lub klasy, czemu nie można zrobić tego samego z kodem PHP danego elementu?

Stworzyłem więc bibliotekę AdvancedReflection rozszerzającą mechanizm refleksji o możliwość wylistowania kodu źródłowego PHP badanego elementu. Przeczytaj resztę tego wpisu »

Kolorowy var_dump()

27 marca 2011

Często podczas programowania potrzebujemy wyświetlić na zawartość jakiejś zmiennej w celu jej zdebugowania. W takim przypadku bardzo przydatną mechanizmem wbudowanym w język PHP okazuje się funkcja var_dump(). Jej główną zaletą w porównaniu do innych funkcji tego typu (jak print_r(), czy var_export()) jest to, że wyświetla ona nie tylko wartość zmiennej, lecz także rodzaj typów w niej przechowywanych.

Funkcja ta ma niestety jedną dokuczliwą wadę, przy dużej ilości danych (rozbudowany array / obiekt) prezentowany wynik potrafi być bardzo nieczytelny.

W tym celu napisałem niewielką klasę, która dodaje do polecenia var_dump() kolorowanie wyników. Przeczytaj resztę tego wpisu »

Co najbardziej spowalnia skrypty PHP?

26 marca 2011

Pierwszą, oczywistą przyczyną jest to, że język PHP, jest językiem interpretowanym, a nie kompilowanym. Nie tłumaczy to jednak kiepskich wyników porównawczych z innymi językami tego samego typu, takimi jak Perl czy Python, które w wielu scenariuszach wykazują o wiele większą wydajnością.

Co sprawia, że język PHP jest od nich wolniejszy? Przeczytaj resztę tego wpisu »

StringBuilder w PHP

24 marca 2011

Jak dobrze wiadomo, PHP nie jest wyposażony w mechanizm typu StringBuilder znany z innych języków jak C# lub JAVA. W Internecie znaleźć można wiele dyskusji na to, czy taka funkcjonalność jest w ogóle do czegoś potrzebna, oraz gotowe implementacje jako dowody na to, że wydajność nie ulega zmianie.

Ja spróbuję przedstawić dowody odwrotne: mechanizm StringBuilder można w PHP zaimplementować, co korzystnie wpływa na wydajność skryptu. Przeczytaj resztę tego wpisu »