Weryfikacja właściciela strony

Aug 17

Niedługo być może zaimplementuje w jeden z moich nowych projektów weryfikację właściciela strony. Pomysł pozwoliłem zrobię zaczerpnąć z Google Webmaster Tool. Natomiast troszeczkę zmieniłem jeden ze sposobów, aby mniej się napracować. Zweryfikowanie właściciela witryny odbywa się po wywołaniu jednej z poniższych metod. Oto one:

  • Weryfikacja poprzez upload pliku na serwer.
  • Chwilowe dodanie meta-tagu do sekcji HEAD.

W stosunku do google, zmianie uległa u mnie weryfikacja pierwsza.

Sposób Google: Upload pliku bez zawartości (lub z dowolną) o nazwie jako hash aktywacyjny, np: <?php md5( secret-salt ) . '.html'; ?>

Mój sposób: Upload pliku ze stałą lub hashowaną nazwą o zawartości 32 znakowego hashu md5.

Zmienia się tylko zawartość pliku. Dlaczego? Niektóre strony zamiast zwracać kod 404 dla nieistniejących plików/podstron zwracają kod 200 (sukces). Wówczas trudno stwierdzić, czy jest to oczekiwany plik. Google dodatkowo sprawdza, czy strona zawsze zwraca kod 200, ale po co się babrać i wykonywać więcej requestów, jak można zrobić to trochę prościej. Jeżeli plik nie będzie fizycznie istniał na serwerze, a strona zwróci kod 200, skrypt musi oczekiwać w odpowiedzi tylko i wyłącznie hashu strony. Nazwa pliku na serwerze może być stała, ale niekoniecznie (dla większego bezpieczeństwa zalecane jest logiczne hashowanie nazwy pliku).

Przygotujmy zatem zarys klasy (od tego zawsze zaczynam):

  • public function CheckFile($sUrl, $sFilename) funkcja sprawdzająca hash w pliku na serwerze.
  • public function CheckMetatag($sUrl, $sTagName) funkcja sprawdzająca hash w metatagu.
  • public static function Hash($sUrl) funkcja budująca hash na postawie adresu URL (jako że podajemy go jako parametr obu metod sprawdzających, zmienna jest łatwo dostępna dla systemu).
  • public static function Metatag($sHash, $sTagName) generowanie kodu XHTML dla metatagu – metoda potrzebna nam przy podaniu użytkownikowi meta tagu oraz do prega w metodzie CheckMetatag();
  • protected static function _Request($sUrl) tworzenie requestu za pomocą HttpRequest i zwracanie treści metodą getResponseBody() wspomnianej klasy.

Jako że komponent jest niejako zewnętrzną biblioteką, nie mogłem go wcisnąć w komponentu frameworka. Otrzymał status biblioteki: VframeLib_WebVeryfication.

Oczekiwane API:

var_dump(VframeLib_WebVeryfication::CheckFile('http://example.com/', 'Veryfication.txt')); // bool result
var_dump(VframeLib_WebVeryfication::CheckMetatag('http://example.com/', 'Veryfication'));
// bool result

Gotowy kod:

http://athlan.pl/code/VframeLib_WebVeryfication

Uwaga. Kod jest w fazie testowej. Wszelkie Wasze komentarze będą uwzględniane przy poprawkach.

7 comments

  1. mam pytanie zadadnicze – ale po co to? :) tzn o co chodzi z ta cala weryfikacja wlasciciela strony? po co cos takiego robic i dlaczego nie przez logowanie itp. ot takie pytanie laika :)

  2. tiraeth /

    Moje pytanie także brzmi “Po co?”. Ja rozumiem, gdyby aplikacji stale pobierała jakieś informacje z innej strony, można by zastosować weryfikację właściciela. Przykładowo, aplikacje agregujące kanały RSS, jak Planeta PHP.pl, mogłyby właśnie takie coś mieć zaimplementowane.

    Z kodem 200 się nie zgodzę. Żaden serwer nie ma prawa wyświetlać kodu 200, gdy nie ma pliku. Jeśli tak się dzieje, to mamy źle skonfigurowane custom_error_pages. Wysłanie “HTTP/1.0 404 Not Found” przed wypuszczeniem własnego “Ooops” nie powoduje niewyświetlenia naszego komunikatu.

    Co do kodu, to niepotrzebny (według mnie) “extends” na VframeLib_WebVeryfication_Exception() – jakie to ma znaczenie (poza wyglądowym) ?

    A, bardzo brzydka literówka: verification :)

  3. @tiraeth: http://www.lookme.pl/Nieistniej%C4%85cyPlik.txt, to tylko przykład. Jak wywołasz kod 404 to wielkie pokłony. Właśnie z tym boryka się google stosując losowe requesty, aby stwierdzić ten fakt – niewydajne. Problem nie w serwerach, a w aplikacjach.

    Prawie każdy Exception ma swoją nazwę, a to dlatego, że w zależności od tego jaki zostanie wyrzucony, taki błąd obsłużę, oczywiście w catchu można dać get_class($e), ale ja wole dziedziczyć, kosmetyka.

    Dzięki za literówkę, jak będę na swoim komputerze to poprawię.

  4. tiraeth /

    @Athlan: A można zobaczyć zawartość pliku .htaccess? Bo wydaje mi się, że po prostu niezbyt dobrze mod_rewrite pokierowałeś na serwerze…

  5. tiraeth /

    Heh, pospieszyłem się z wpisem powyżej. Rewrite nie ma tu nic do rzeczy.

    A wywołać kod 404 można. Jeśli plik nie istnieje, to serwer automatycznie nas do aplikacji wrzuca. Wtedy sprawdzamy, czy dostarczony adres URL ma swoje “odwzorowanie” w systemie routingu. Jeśli ma – wyświetlamy to, co potrzeba. Jeśli nie – wysyłamy kod 404, a następnie zrzucamy tu albo kontroler domyślny bądź kontroler błędu 404. Względnie do potrzeb. I po kłopocie. Użytkownikowi się wyświetli to, co ma się wyświetlić (chyba, że ma IE6, to 404 dostanie z góry bez treści), a nagłówki będą miały “Connection: close” :)

    Poza tym, wydaje mi się, ze Google Analytics nie na darmo napisało “Create an empty file …” :)

  6. Tiraeth: ja doskonale wiem jak to powinno wyglądać od strony aplikacji i frameworka. Ale fajnie, że to napisałeś, bo możliwe że niewiele osób to wie. Lookme.pl to dość stary engine (półtora roku, na nim się uczyłem OOP).

    Pamitętam jeszcze, że nawet kiedy uploadowałem empty file na serwer, Google informował mnie o statusie 200 dla każdej podstrony. Nie mam pojęcia jaki ma w tym interes, bo za każdym razem wyskakiwała strona główna (not empty), ale mnie to denerwowało. Minus taki, że w ogóle to sprawdzali… powinni już wtedy z góry narzucić określoną treść pliku (czyli de facto zanegować treść str głównej), np jakiś checksum, czy – tak jak to zrobili juz teraz – empty content.

    Ja u siebie zastosowałem podobną technikę.

    @user, @tiraekt, pytanie po co… może byłoby się bardziej zastanowić nad sensem zastosowania, gdyby google nie weryfikowało właściciela strony. Ja w tym sens widzę. Dlaczego? Mały przykład. Załóżmy, że jakaś strona ma buga w komentarzach i można wstawić kod JS ze statystykami, żeby sprawdzić potencjalną ilość gości na podstronach (tak jak było to możliwe na słynnym serwisie zlecenia.przez.net). Ale pliku na serwer nie zuploadujesz (raczej :P ).

  7. Mam pytanie jak zweryfikować stronę to bezpłatna domena z brakiem sekcji Dodam iż jedna osoba dokonała zweryfikowania strony jest w tej samej domenie jak coś to mogę dać kody stron pozdrawiam

Leave a Reply