9/3/2011
Coś się posypało Onetowi i przez kilka chwil na niektórych blogach zamiast treści internauci otrzymywali kod źródłowy w PHP, poinformował nas jeden z czytelników. Ta niegroźna wpadka prowadzi do kilku ciekawych wniosków.
Kod PHP szablonu bloga na Onecie
Na wstępie podkreślmy, że tego typu błędy zdarzają się często i naprawdę nie jest to nic “superstrasznego”. Zdradliwa w tym przypadku może być np. zabawa konfiguracją webserwera bezprośrednio na produkcji (czasem wystarczy zmiana kolejności regułek rewrite’ujących lub brak instrukcji kierującej dany typ plików na interpreter PHP).
Nie Onet pierwszy i ostatni, chociaż trzeba nadmienić że Onetowi w przeszłości zdarzało się już omyłkowo serwować kod PHP — wspomnijmy tylko zabawny komentarz opisujący zmienną odpowiedzialną za przekazywanie “pełnego” cookie do serwisów partnerskich: “(unikać jak ognia)“. Przechodząc jednak do wniosków z dzisiejszego zdarzenia:
- uważaj na komentarze w kodzie, jeśli kod “wycieknie” lub zostanie przypadkowo upubliczniony, niektórzy mogą sobie żartować, a czasem nawet wykorzystać zawarte w nich dane do ataków social-engineering:
- dbaj o jakość kodu — to chyba najcięższe, bo każdy z nas czasem jest zmuszony do stosowania brzydkich “hacków”, ale trzeba mieć świadomość, że jeśli kod “wycieknie” lub zostanie przypadkowo upubliczniony, niektórzy mogą zauważyć w nim błędy (także bezpieczeństwa) lub poznać inne grzeszki, które w nim przemyciliśmy.
- testuj zmiany, które wprowadzasz do konfiguracji produkcyjnych maszyn na testowym webserwerze. Jasne, nie każdego na to stać, ale pomyłka może kosztować cię drożej niż środowisko testowe, jeśli w niesparsowanym kodzie PHP pojawi się hasło do bazy danych... (Onet na szczęście trzyma część kodu PHP w katalogach, do których dostęp z zewnątrz wymaga uwierzytelnienia)
- Zgodnie z zasadą Security-In-Depth, zastanów się, jak (i czy w ogóle) możesz skonfigurować swojego WAF-a tak, aby uniemożliwiał internautom dostęp do “gołych” plików PHP w przypadku “problemów” webserwera.
//sprawdzenie czy blog XXX-jesli tak to bez reklam!
//nr zlecenia 119XX rafal.XXXX@portal.onet.pl
Ale to nic w porównaniu z tym, co można znaleźć w kodzie źródłowym Windows (btw: przeklinania).
Dowcipnie rzecz ujmując, wersja PHP niektórych blogów Onetu podoba nam się zdecydowanie bardziej od ich wersji normalnej… Kto wie, może Onet zdechł właśnie ze względu na nadmiar różu u emo-martynki i podobnych? :>
P.S. Dziś chyba dzień plucia kodem (mind, że to nie PHP). Właśnie otrzymaliśmy screenshot z dzisiejszej Naszej Klasy:
Informacje podesłał macnow.
Tak btw… te ich programowanie to jakis kiepski zart :D
Z tymi ifami to przegięcie – nie lepiej trzymać tabelę w bazie z id blogów bez reklam i po prostu sprawdzić czy taki rekord istnieje? Prostrze w zarządzaniu (wystarczyłby mały moduł do tego) i IMHO powinno być wydajniejsze (oczywiście jeśli będą indeksy i LIMIT 1 ;)).
Widać jesteś taki pro koder, że powinieneś się starać o pracę w Onecie, do dzieła więc! ;-)
mala korekta : “emo-martynka”, nie “emo-malwinka”! ;)
Głęboka analiza: kiepskie (?) komentarze, “małowydajne instrukcje if”. Serio, to jest najważniejsze w kodzie, który wyciekł?
Nie wiem, czy zauważyłeś, ale nas mało interesuje co jest w kodzie, którym pluł Onet, czy inne serwisy. Zastanawiamy się raczej, jak zmniejszyć szanse na wystąpienie takich sytuacji oraz co zrobić, żeby zminimalizować ryzyko w momencie, kiedy taka sytuacja nastąpi.
Ich kod pierwsza klasa – powrót do czasów 2000 roku i PHP4 lub nawet PHP3 :) Zdaję sobie sprawę, że przepisanie takiego giganta to ogromny koszt, ale bez przesady – lepszym kodem lepiej zarządzać, lepiej takie serwisy rozwijać, etc. To co jest tutaj to szok.
@Kamil: dlatego teraz promują WordPressa u siebie ;)
Kamil – mało widziałeś. Czasami coś musi działać w przeciągu 5 minut i potem są lepsze kwiatki niż takie ify
Szkoda, że zabrakowało informacji o sposobie zabepieczenia przed takim fakapem… a artykuł miał na celu tylko pokazanie “niekompetencji pracowników Onetu”, wystarczyłoby podać kawałek konfiguracji do ModSecurity, albo chociaż wspomnieć o takim narzedziu i wyglądalibyście na takich którzy rzeczywiście chcą pomóc… ;-) tylko w sumie co Was interesują kwestie techniczne… ;->
pzdrv.
Po prostu nie wklejaj w ustawieniach serwera takiej linijki:
RemoveType .php
:D
Czyżby pracownik Onetu?? :] Ja nei widze zeby Niebezpiecznik pokazywal niekompetencje Onetu, przeciez wyraznie wspomnieli ze takie bledy sie zdarzaja kazdemu a dodatkowo my na podstawie tego tekstu wlasnie czyscimy komentarze w swoim kodzie na produkcji i dodajemy BasicAuth do includow. poza tym troche malo wiadomo co dupnelo w onecie, wiec ciezko powiedziec czy przypadkiem nie winny nie jest proponowany przez ciebie modsecurity :>>
A i pokaz mi modsecurity dla nginx ;] mysle ze najlepsza ochrona przed takimi fakapami jest jednak __rozwazne__ wprowadzanie zmian w configach, bo config srodka zabezpieczajacego przed fakapem tez mozna spieprzyc i bedzie doublefakap ;] pzdr.
Patryk, chyba przesadzasz albo niedokładnie czytasz :> Nie wierzę też, że uważasz iż ModSecurity jest lekiem na całe zło (hint: jestem pewien, że potrafisz sobie wyobrazić konfiguracje bardziej złożone niż jeden webserwer na Apache i znasz takie sytuacje, w których regułka ModSecurity na za wiele się nie zda jeśli chodzi o serwowanie gołego PHP ;). Tak czy inaczej, do tekstu dopisałem zdanie o konfiguracji WAF-u, bo jednak ModSecurity nie jest rozwiązaniem pasującym do każdej “architektury”.
Piotrek: ModSecurity było bardziej skrótem myślowym, ale fajnie, że wspomniałeś o WAFie ;-) czasami mnie drażni, że ktoś ukazuje coś bardziej na zasadzie, zobaczcie jak spieprzyli, a nie podaje jakiegoś sposobu rozwiązania problemu… taka moja techniczna natura ;-)
Patryk: nie wiem, czy przypadkiem nie widzisz, tego czego chcesz… ;) Każdy logicznie myślący człowiek IMHO powinien odebrać tego posta tak: “dzisiaj oni, jutro to możemy być my, wyciągnijmy wnioski” (przynajmniej my go tak odbieramy i w tym celu on powstawal). I mimo wszystko uważam, że wspomniana przez nas potrzeba środowiska testowego i podążąnie za *oficjalną procedurą* dot. wprowadzania zmian na produkcje są istotniejsze niż …WAF :-) I żeby nikt nie łapał mnie za słówka: nie sugeruję, że to właśnie brak procedur zawiódł w Onecie — ba! jestem świadom, że zdarzają się procedury, które nie pokrywają wszystkich przypadków por. http://www.cse.lehigh.edu/~gtan/bug/softwarebug.html ;)
“Wersja PHP niektórych blogów Onetu podoba nam się zdecydowanie bardziej od ich wersji normalnej… Kto wie, może Onet zdechł właśnie ze względu na nadmiar różu u emo-martynki i podobnych? :>”
tak, tak… eot ;-)
@atom: Nie mówię o ifach, tylko ogólnie o takim kodzie: [skasowane]. Strukturalny dla takiego kolosa? Hehe. Widziałem sporo, ba, sam tworzyłem za czasów PHP4 i sam wytwarzałem taki kod… 5 lat temu.
czasem koszt przepisania kodu jest nieadekwatny do zysków i wtedy czasem się latami go nie modyfikuje, a to, że jest przestarzały, może nawet kiepsko napisany nic nie znaczy, ważne, że działa
dodatkowo czasem okazuje się, że kod strukturalny jest szybszy niż ładny model obiektowy
szybszy w działaniu (mikrosekundy, choć przy milinach odwiedzin to zawsze coś, ok), ale wolniejszy w rozwoju i dalszej pracy nad nim ;)
Kod strukturalny jest wydajniejszy od obiektowego. Nie to żebym popierał jakoś tego kodu. Wiem z pewnych źródeł że w innym kolosie przepisywali kod na strukturalny, ze względu na wydajność, ograniczali dynamicznie generowane treści, a kod wyglądał masakrycznie brzydko tylko po to by zaoszczędzić na czasie procka. Choć w tym wypadku to raczej stary kod a nie po optymalizacji.
“mikrosekundy” bla bla bla, czasem zdziwiłbyś się jak bardzo
czas programisty > czas pracy komputera
chyba, że mówimy o Google, Facebooku czy czymś podobnym
w innych przypadkach cache w zupełności wystarczy, zwłaszcza dla tak statycznych danych jakich dostarcza Onet (blogi w tym przypadku)
Powiew open source z onetu ;D
wszedłem na emo martynka i doznałem uszczerbku na psychice, żądam odszkodowania! i zakazuje umieszczania takich linków do tak chorych psychicznie stron! stop idiotyzmowi i postępującemu debilizmowi, wystarczy nam to co już serwuje rząd. na pohybel!
Ja myślę, że żeby stworzyć taką stronę trzeba mieć bardzo dużo cierpliwości i pomysłowości.
Wystarczy sobie wyobrazić ile czasu i nerwów zajmuje wymyślanie treści i tłumaczenie na użyty na stronie język.
Z wyglądem jest trochę lepiej bo do tworzenia strony może mieć jakiś normalny, mniej oczoje**y.
a jakie sa powody do żartowania z zacytowanych komentarzy ??? ze słowo “inklud”?
!eregi(“chrome”, $_SERVER[‘HTTP_USER_AGENT’])
ereg do szukania ciagu znaków, kiedyś tak pisałem… Dawno. :D
Nie ma to jak logika w szablonach:)
Ehm, powinno być nie “Onet” tylko “pewien krakowski portal” (apropo ukrywania nazwy agencji).
“…pomyłka może kosztować cię drożej niż środowisko testowe…” – błąd (pleonazm). Powinno być: “…pomyłka może kosztować cię więcej niż środowisko testowe…”.
Taki dziwny dzisiaj dzień, rano hatak.pl pluł SQL’em, na szczęście tym co serwuje reklamy, więc było nawet lepiej :)
Ehm.. chyba powtarzamy dziś 30 listopada jak to Allegro i GG coś tam spaprało , a już wiem, GG Air miało błąd , a Allegro nie pamiętam :D. Plus jeszcze ten banki 30 listopada, ING i jakiś tam jeszcze ;s
Oj dziwny.. mybank.pl tak samo dzisiaj 2 razy uraczył mnie gołym kodem.. Może to ma związek z tą niedostępnością serwerów home.pl dzisiaj w nocy (?) ;)
Hah, wczoraj to mi nawet deviantart.com zaczal wysypywac kod :P szkoda ze screenow nie porobilem (bylo cos podobnego do nk)
Przypomina mi się pewien programista, jakiego spotkałem jakiś czas temu. Pisząc jakiś prosty portalik do uzytku wewnętrznego nastrugał kilkanaście/kilkadziesiąt funckji, które robiły w sumie to samo (SELECT id FROM tabela). Oczywiście funkcje nazywały się różnie, bo za każdym razem chodziło o inną tabelę, o inne id (nazwa pola w tabeli).
Myślę, że te warunki dotyczące reklam na blogach wynikają z tego, że trzeba było kiedyś zrobić coś na szybko, na chwilę. A potem skoro jest mechanizm, to copy-paste, zmiana wartości ID i mechanizm jest cacy :)
A potem programisty się zastanawiają czemu parser musi każdą stronę 5 sekund mielić :-)
To ja dorzucę niepolski przykładzik z ostatnich dni. chess.com to chyba największy webowy serwis szachowy.
http://flaker.pl/f/6839949-to-milo-dostac-dokladna-diagnostyke-bledu-czytanielogowjestdlalamerowtwardzielelogujanaekran
Wierzcie lub nie, ale mnie kiedyś Grono opluło czymś takim, z tą różnicą że tam… był host, login i hasło do bazy w formie plaintext xD. Serwer bazy jednak był skonfigurowany z głową i nie przyjmował połączeń z zewnątrz więc to ich uratowało
A’propos niecenzury – ciekawe rezultaty daje grep -r (fuck|shit) na kernelu linuksowym ;)
@Mekk Chess.com – głownym developerem jest Pan Piotr zdaje się z Poznania czy Wroclawia ;)
Co do problemu kodu, rozwiazanie na to oczywiscie jest, moze czesciowe, ale zapobiega takim fuckupom.
Wystarczy includowac kod z innych katalogow, na przykłądzie indeź.php
require_once (“app/index.php”)
tak, aby każdy plik wywoływany bezpośrednio miał jedynie includa na froncie.
W ten sposób nawet jeśli będzie wysypka serwera, nikt nie zobaczy naszego kodu.
No, głównym jak głównym ale na pewno znaczącym, o ile pamiętam odpowiada za kawałek do gry na żywo i głównie zajmuje się javascriptem. Tu jest jakiś stary wywiad: http://www.prototypejs.org/2008/5/28/an-interview-with-piotr-dachtera
Co do prezentacji kodu… Ech, tak naprawdę wystarczy nie używać PHP ;-)
[…] zabezpieczyć się przed tego typu sytuacjami wyjaśnialiśmy już przy okazji podobnego zdarzenia na Onecie. Dodatkowo, na przykładzie Tumblera pięknie widać, że Security in depth to dobra strategia; […]
[…] trakcie której wyłączony zostanie parser plików PHP. Przykładem tego typu awarii jest niedawne upublicznienie swoich kodów źródłowych przez portal onet.pl (wyciek żródeł dotyczył na szczęście tylko platformy blogowej). W normalnych warunkach […]
hehe a mi przedwczoraj sie posypał apache. Jednak wszylo na dobre bo sie przesiadłem na nginx.
[…] do kodu źródłowego webaplikacji z reguły nie jest możliwy (chyba, że na skutek błędu parsera) — ale skoro “bezpieczna wymiana plików” Facebooka bazuje na oprogramowaniu […]
[…] Tego typu błąd (tzn. brak parsowania PHP) ujawnił się też kiedyś na serwerach Onetu. […]
[…] PS. Taki problem dotknął też kiedyś i Onet. […]