TimThumb – co to jest i czy trzeba się tego obawiać?

TimThumbTimThumb to skrypt służący do skalowania obrazków. Jest bardzo prosty w użyciu, a dzięki wbudowanemu mechanizmowi cache nie obciąża w znaczący sposób serwera – i prawdopodobnie właśnie dlatego upodobali go sobie twórcy szablonów dla WordPressa (mimo że nie powstał on z myślą o tym CMSie). W sierpniu 2011 roku odkryto w nim dość poważną lukę bezpieczeństwa, która została usunięta w ciągu dosłownie kilku dni. Kilka tygodni po tym incydencie autor skryptu ogłosił wydanie wersji 2.0 – skrypt został przepisany praktycznie od nowa i jest całkowicie bezpieczny. Niestety, łatka niebezpiecznego skryptu została do TimThumba przyklejona już chyba na stałe, mimo że w tym momencie po prostu mu się ona nie należy.

Zobaczmy dlaczego skrypt ten jest tak chętnie używany i dlaczego nie ma powodu aby się go obawiać. A wszystkim nie do końca przekonanym wskażę alternatywy.

TimThumb nie jest już wspierany – alternatywne skrypty opisałem na końcu tego wpisu

Dlaczego TimThumb a nie wbudowany w WordPressa mechanizm skalowania obrazków?

WordPress posiada wbudowany mechanizm generowania miniatur obrazków, który działa bardzo dobrze, ale nie jest doskonały. Wymaga, aby każdy używany przez szablon czy wtyczkę rozmiar był zarejestrowany za pomocą funkcji add_image_size(), a miniatury są generowane podczas przesyłania obrazków do biblioteki. Z jednej strony oznacza to, że obrazki już istniejące w bibliotece mediów nie zostaną automatycznie przeskalowane, a z drugiej – że podczas przesyłania zdjęcia zostaną wygenerowane wszystkie możliwe rozmiary miniatur, niezależnie od tego, czy są potrzebne czy nie.

TimThumb rozwiązuje te problemy – obrazki są skalowane „w locie” do dowolnych podanych w parametrach rozmiarów, przez co dają twórcy szablonu niemal nieograniczone możliwości. Rozbudowane motywy premium często wykorzystują nawet kilkanaście różnych rozmiarów jednego obrazka (ikony wpisów, widżety, slidery itp.), nie wspominając o możliwości samodzielnego ustawienia rozmiaru zdjęcia przez użytkownika. Widać więc, że korzystanie ze skalowania obrazów „w locie” jest bardzo wygodne, a jednocześnie użyteczne (biblioteka mediów nie jest zapchana niepotrzebnymi miniaturami we wszystkich możliwych rozmiarach).

Z TimThumba korzystają nie tylko autorzy motywów (zarówno darmowych, jak i płatnych), ale także wiele dużych serwisów używających WordPressa (w Polsce za przykład może posłużyć popularny AntyWeb.pl).

Szablony i wtyczki korzystające z tego skryptu nie mogą jednak zostać umieszczone w oficjalnym repozytorium WordPressa. Od niedawna również ThemeForest, największy market z szablonami premium, zakazał (chyba tak na wszelki wypadek) używania TimThumba – nowe i uaktualniane motywy nie mogą już z niego korzystać. Decyzja ta jest o tyle dziwna, że w żaden sposób nie wymuszono aktualizacji szablonów zawierających starą (niebezpieczną) wersję skryptu, a zabroniono używania jego aktualnej, bezpiecznej wersji.

Korzystanie z TimThumba

Żeby pokazać, jak łatwe jest korzystanie z TimThumba, użyję przykładu. Aby wyświetlić obrazek zdjecie.jpg w rozmiarze 400 x 300 pikseli, wystarczy taki kod:


Proste, prawda? TimThumb dodatkowo posiada możliwość przycinania obrazków gdy proporcje oryginału różnią się od proporcji rozmiaru docelowego.

Wady TimThumba

Niestety, TimThumb nie jest narzędziem pozbawionym wad. Przede wszystkim wymaga odpowiednio (a raczej poprawnie) skonfigurowanego serwera. Z moich doświadczeń wynika, że skrypt nie działa na dosłownie kilku procentach serwerów, a poprawka sprowadza się do ustawienia poprawnej wartości zmiennej $_SERVER['DOCUMENT_ROOT'].

Drugim problemem TimThumba są odpowiednie uprawnienia katalogu cache, w którym trzymane są przeskalowane wersje obrazków. Na większości serwerów uprawnienia 755 (zalecane dla katalogów) okażą się wystarczające, ale zdarzają się sytuacje, w których skrypt będzie działał tylko z uprawnieniami 777 (co nie jest zbyt bezpieczne).

Luka bezpieczeństwa

TimThumb oferuje przydatną funkcję skalowania obrazków pochodzących z zewnętrznych serwerów (np. Flickr czy WikiMedia). Dzięki temu możemy wyświetlić na naszej stronie zdjęcia z tych serwisów, przy czym przeskalowany plik jest trzymany w cache na naszym serwerze. W konfiguracji skryptu możemy określić adresy URL, z których obrazki mogą być pobierane. Niestety, w starej wersji skryptu sprawdzany był tylko fragment nazwy, przez co atakujący mógł podszyć się pod jedną z dozwolonych stron (np. używając domeny 123456flickr.com) i przesłać w ten sposób do katalogu cache odpowiednio spreparowany skrypt, który następnie mógł zostać wykonany na naszym serwerze. To poważna luka, którą do dzisiaj wykorzystują złośliwe skrypty skanujące oparte na WordPressie strony w poszukiwaniu luk bezpieczeństwa.

Jak nietrudno się domyślić, rozwiązaniem tego problemu było całkowite wyłączenie funkcji pozwalającej na używanie obrazków z zewnętrznych serwerów. W aktualnej wersji funkcja ta działa już poprawnie.

Jak uaktualnić TimThumba?

Jeśli korzystamy z szablonu lub wtyczki, która używa nieaktualnej wersji TimThumba, to powinniśmy jak najszybciej dokonać aktualizacji. Na szczęście autor skryptu zadbał o to, aby parametry pozostały bez zmian – tak więc aktualizacja polega w praktyce na podmienieniu pliku na nowy.

Aktualną wersję TimThumba można pobrać ze strony projektu. Wystarczy znaleźć na naszym serwerze plik timthumb.php i zastąpić go nowym. Niektórzy autorzy szablonów celowo zmieniają nazwę skryptu, na przykład na tt.php czy thumb.php.

Alternatywy dla TimThumba

Po awanturze wokół bezpieczeństwa TimThumba powstało wiele alternatywnych skryptów skalujących, w tym kilka korzystających z wbudowanych funkcji WordPressa. Mają one kilka zalet: są stosunkowo proste (większość logiki leży po stronie WordPressa), umieszczają przeskalowane obrazki w katalogu uploads (większy porządek na serwerze) i są bezpieczne (przynajmniej dopóki sam WordPress jest bezpieczny).

Warto pamiętać, że wszelkie skrypty korzystające z wbudowanych w WordPressa funkcji do manipulowania obrazami nie obsługują zdjęć zamieszczony na zewnętrznych serwerach.

Jeśli szablon korzystający z TimThumba został stworzony w rozsądny sposób, to wywołania skryptu nie są umieszczone bezpośrednio w plikach szablonu, ale „opakowane” w jakąś funkcję, dzięki czemu ewentualna zmiana skryptu na inny nie powinna stanowić problemu. Trudno tu jednak udzielić jakiejś uniwersalnej rady, ponieważ w każdym motywie może to wyglądać inaczej.

Aqua Resizer

Jeden z pierwszych zastępników TimThumba. Aby wyświetlić przeskalowany obrazek należy w szablonie wstawić taki kod:


BFI Thumb

Klon skryptu Aqua Resize, rozbudowany o możliwość skalowania obrazków „w górę”, przycinanie oraz nakładanie filtrów. Różni się nieco sposobem wywołania:

 400, 'height' => 300};
?>

Więcej informacji na temat możliwości skryptu, w tym parametry dotyczące filtrów, można znaleźć na jego stronie.

mr-image-resize

Skrypt działa na podobnej zasadzie co dwa poprzednie, ale dodatkowo posiada funkcję usuwania przeskalowanych obrazków podczas usuwania obrazka głównego (co pozwala na utrzymanie jako takiego porządku na serwerze). Ma jednak nieco większe wymagania jeśli chodzi o działanie w instalacji sieciowej (Network Installation).

Wywołanie skryptu wygląda następująco:


WordPress TimThumb Alternative

Skrypt o mało oryginalnej nazwie, posiadający (poza standardowymi funkcjami) możliwość generowania przeskalowanych miniatur dostosowanych do ekranów Retina (czyli w praktyce dwa razy większych). Usuwa on również przeskalowane obrazy w momencie usuwania obrazu głównego.

Aby skorzystać ze skryptu należy w szablonie umieścić następujący kod:


Zdjęcie: Alan Cameron

Bezpośredni link