Archiwum z Kwiecień 2011

Drupal i HipHop for PHP – część I: kompilacja

piątek, 29 Kwiecień 2011

Tuż po upublicznieniu HipHop for PHP w Internecie pojawiło się wiele artykułów na temat tego kompilatora oraz możliwości jakie może zaoferować istniejącym skryptom PHP. Większość z tych tekstów opisywało jednak problemy, które uniemożliwiały skompilowanie dwóch najpopularniejszych systemów CMS Drupal, i Joomla. Operacja kończyła się niepowodzeniem z powodu złej jakości kodu PHP, w który zostały napisane oba systemu.

Informacje zawarte we wspomnianych artykułach są już jednak nieaktualne: od czasu ich publikacji pojawiły się nowe wersje obu systemów CMS, mianowicie Drupal 7 oraz Joomla 1.6.

Czy w nowych wersjach poprawiła się jakość kodu PHP? Czy system Drupal można już bez problemu skompilować? Niniejsza seria artykułów odpowie na te pytania. (więcej…)

Mod_rewrite oraz HipHop for PHP na serwerze Apache

poniedziałek, 25 Kwiecień 2011

Skrypty PHP skompilowane kompilatorem HipHop for PHP mogą bez problemu działać jako serwery HTTP. Nie udostępniają one jednak najpopularniejszej w Internecie metody tworzenia przyjaznych linków, czyli modułu mod_rewrite dostarczanego razem z serwerem Apache.

W tym artykule opiszę najprostszy sposób uruchomienia skompilowanych skryptów PHP z poziomu serwera Apache. (więcej…)

HipHop for PHP – Instalacja na CentOS 5.x

czwartek, 21 Kwiecień 2011

W jednym z poprzednich artykułów opisałem jak przeprowadzić instalację kompilatora HipHop for PHP na systemie Fedora.

Wspomniałem też wtedy o problemach, jakie miał z tym kompilatorem system CentOS 5.5.

W niniejszym artykule pokażę, jak pokonać te trudności i poprawnie zainstalować na tym systemie kompilator HipHop for PHP (więcej…)

Zastępcy eval w PHP: czyli jak szybciej zrobić sobie coś złego

wtorek, 19 Kwiecień 2011

Zapewne wszyscy programiści PHP wiedzą, do czego służy polecenie eval() oraz to, że nie należy się nim posługiwać.

Powodów tego stanu rzeczy jest kilka, przede wszystkim jednak problemem jest bezpieczeństwo kodu i szybkość jego wykonywania. Dodatkową niedogodnością może być też fakt, że polecenie eval() nie jest obsługiwane przez kompilatory języka PHP (np. HipHop for PHP).

Istnieją niestety takie sytuacje, gdy konieczne jest wykonanie dynamiczne utworzonego kodu. W tym artykule skupię się na zagadnieniu wydajności i metodach zastąpienia polecenia eval() szybszymi odpowiednikami.
(więcej…)

Nadpisywanie wbudowanych protokołów PHP własnym wrapperem strumienia

piątek, 15 Kwiecień 2011

Po ostatnich, dosyć wyczerpujących artykułach na temat silnego typowania danych, oraz autentykacji NTLM poprzez atak man-in-the-middle, postanowiłem przedstawić coś znacznie lżejszego.

Nieraz podczas pisania aplikacji natrafiałem na zabezpieczenia w stylu „system plików jest w trybie: tylko do odczytu, PHP ma prawa zapisu wyłącznie w bazie danych”. Jest to oczywiście skrajny przypadek zabezpieczeń przed hackerami, jednak w moim przypadku zdarzający się dosyć nagminnie. W tak zabezpieczonym środowisku pojawiają się więc dosyć nietypowe problemy z funkcjami wbudowanymi w PHP, gdyż niektóre z nich wymagają praw zapisu do katalogów na dysku lokalnym (upload plików, cache WSDL, biblioteka cURL), lub odczytu z plików (np. SoapClient nie potrafi odczytać treści WSDL bezpośrednio ze zmiennej, lecz tylko poprzez protokół HTTP lub z pliku lokalnego).

Opiszę więc krótko mało znane i dosyć egzotyczne obejście tych problemów: nadpisywanie wbudowanych w PHP protokołów własnymi. (więcej…)

Uwierzytelnianie NTLM i Single Sign On: czyli jak w PHP zalogować się do ActiveDirectory bez znajomości loginu i hasła

czwartek, 14 Kwiecień 2011

Przeglądając gotowe biblioteki PHP do uwierzytelniania w domenie ActiveDirectory zauważyłem, że żadne z tych rozwiązań nie pozwala na zalogowanie użytkownika domenowego bez konieczności podania przez niego loginu i hasła.

Funkcjonalność automatycznego logowania do domeny wbudowana jest oczywiście tylko w w przeglądarce Internet Explorer, ale powiedzmy sobie szczerze: w dużych firmach i korporacjach jest to nadal jedyna słuszna aplikacja do surfowania po Int(ra|er)necie.

Co ciekawe, w innych językach programowania (Java, C#) nie ma najmniejszego problemu, by użytkownik domenowy mógł wejść poprzez Internet Explorer do chronionego serwisu, istnieje tam wiele gotowych rozwiązań operujących na uwierzytelnianiu NTLM.

Po dwóch dniach spędzonych na czytaniu dokumentacji Microsoftu, Samby, oraz po sniffingu sieciowym, udało mi się zaimplementować działające rozwiązanie.

W niniejszym artykule postaram się przybliżyć schemat automatycznego logowania skryptów PHP do domeny ActiveDirectory za pomocą… ataku Man-in-the-middle. (więcej…)

Obiektowe PHP: Implementacja getterów i setterów znanych z języka C#

środa, 13 Kwiecień 2011

Każdy, kto choć raz przyjrzał się językowi C#, mógł zauważyć, że posiada on możliwość deklarowania konkretnych getterów oraz setterów dla właściwości obiektu, np w taki sposób:

public class Person
{
    //default constructor 
    public Person()
        {
        }
 
    private string _Name;
    public string Name
    {
        //set the person name
        set { this._Name = value; }
        //get the person name 
        get { return this._Name; }
    }
}

O ile w języku PHP udostępniono zarządzanie magicznymi zmiennymi poprzez funkcje __get() oraz __set(), to jednak rozwiązanie to ma jedną wielką wadę. Zmienne magiczne nie są widoczne z poziomu kodu PHP (w ramach deklaracji klasy), ani z poziomu aplikacji IDE (do czasu aż zadeklaruje się je „wirtualnie” z poziomu komentarzy phpdoc).

Przedstawiam więc kolejną, mało znaną funkcjonalność języka PHP, która rozwiązuje wspomniany problem. Jest nią umagicznianie zadeklarowanych właściwości obiektu. (więcej…)

Silne typowanie danych w PHP, część II: autoboxing oraz niezniszczalne obiekty

wtorek, 12 Kwiecień 2011

We wcześniejszym artykule dotyczącym silnego typowania opisałem mechanizm typehintów, który wymusza zgodność typów danych (także nie będących obiektami) przekazywanych do metod i funkcji. Niestety wspomniana implementacja nie zabezpiecza przed innym problemem związanym z dynamicznym typowaniem zmiennych: brakiem kontroli typu podczas nadpisywania wartości zmiennych.

W celu zapewnienia kontroli typu, postanowiłem wprowadzić do języka PHP pojęcie autoboxingu znanego z języków C#, oraz Java. (więcej…)

Jak obliczyć bieżące zużycie CPU przez skrypt PHP?

wtorek, 12 Kwiecień 2011

Istnieje wiele skryptów obliczających czas wykonywania programu, jego zużycie pamięci, a nawet ilość zapytań wysłanych do baz danych.

Wszystkie wymienione przeze mnie wskaźniki są niezwykle istotne podczas testowania kodu w celu jego późniejszej optymalizacji. Mi jednak brakuje jeszcze jednego parametru: procentowego zużycia CPU przez skrypt PHP! (więcej…)

Code injection czyli prosty wirus PHP zapisany w obrazku JPEG

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

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…)