Archiwum kategorii ‘PHP’

UTF-8 i zła walidacja tekstu

poniedziałek, 11 Kwiecień 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. (więcej…)

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

czwartek, 7 Kwiecień 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. (więcej…)

Shared hosting: wykradanie ciasteczek HTTP

czwartek, 7 Kwiecień 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. (więcej…)

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

poniedziałek, 4 Kwiecień 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.
(więcej…)

Pilnuj kodu swego…

piątek, 1 Kwiecień 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. (więcej…)

HipHop for PHP: Test wydajności

czwartek, 31 Marzec 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. (więcej…)

HipHop for PHP – Instalacja na Fedora 12 – 15

czwartek, 31 Marzec 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 . (więcej…)

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

środa, 30 Marzec 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. (więcej…)

Zaawansowany mechanizm refleksji w PHP

poniedziałek, 28 Marzec 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. (więcej…)

Kolorowy var_dump()

niedziela, 27 Marzec 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. (więcej…)

Co najbardziej spowalnia skrypty PHP?

sobota, 26 Marzec 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? (więcej…)

StringBuilder w PHP

czwartek, 24 Marzec 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. (więcej…)

Jak obejść limit przestrzeni dyskowej na koncie WWW

czwartek, 24 Marzec 2011

Przy wyborze serwera hostingowego pod nową stronę WWW jednym z głównych czynników decydujących „za” lub „przeciw” jest limit dostępnej przestrzeni dyskowej.

Chociaż w dzisiejszych czasach większość firm na rynku prześciga się między sobą w ilości oferowanych gigabajtów (tak dostępnego transferu, jak i powierzchni), zademonstruję, jak te limity obejść całkowicie (lecz krótkoterminowo). (więcej…)