Próbuję napisać procedurę oneboxing, która zapewnia specjalne traktowanie wpisów na blogu WordPress. Biorąc pod uwagę prosty, pozbawiony ozdób adres URL w treści, taki jak
http://blog.stackoverflow.com/2011/03/a-new-name-for-stack-overflow-with-surprise-ending/
Jak wykryć, że jest to instalacja WordPress, najlepiej bez wykonywania pełnego HTTP GET przy każdym wyświetlanym adresie URL?
Z pewnością istnieją wspólne konwencje dotyczące adresów URL WordPress, od których moglibyśmy zacząć, co eliminuje przynajmniej niektóre adresy URL z rywalizacji. W tym przypadku jest to ...
Ale to też nie jest uniwersalna stała.
Próbowałem spojrzeć na nagłówki tego adresu URL za pomocą HTTP HEAD i widzę:
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:18340
Content-Type:text/html; charset=UTF-8
Date:Thu, 07 Jun 2012 07:07:38 GMT
Keep-Alive:timeout=15, max=100
Server:Apache/2.2.9 (Ubuntu) DAV/2 PHP/5.2.6-2ubuntu4.2 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
Vary:Cookie,Accept-Encoding
WP-Super-Cache:Served legacy cache file
X-Pingback:http://blog.stackoverflow.com/xmlrpc.php
X-Powered-By:PHP/5.2.6-2ubuntu4.2
Nie sądzę, że poleganie na obecności WP-Super-Cache
byłoby szczególnie niezawodne, a to jedyna rzecz, którą widzę w nagłówkach, która by pomogła, więc może nie ma zerowych wspólnych nagłówków HTTP w instalacji WordPress?
Odpowiedzi:
Z mojego doświadczenia i szybkiego wyszukiwania kodu nie wynika, że WP identyfikuje się w nagłówkach. Są jednak takie, które wydają się wystarczająco wyraźne i raczej nie będą dostosowane.
HEAD to
/wp-login.php
będzie zawierać następujące informacje dotyczące instalacji .org:I dla .com:
Nazwę pliku cookie można dostosować, definiując
TEST_COOKIE
stałą, aleWP Cookie check
ciąg jest zapisany na stałe w rdzeniu, a takżeset_cookie()
wymaga tego w źródle pliku.Do lokalizacji
wp-login.php
są skróty URL (zaimplementowanewp_redirect_admin_locations()
od wersji WP 3.4 (patrz bilet nr 19607 ):/login
katalog główny witryny302
przekierowujewp-login.php
, gdziekolwiek się znajduje.Tak więc jedyny scenariusz, którego nie można niezawodnie wykryć, jeśli WP jest zainstalowany i ograniczony do podkatalogu, bez użycia go do zarządzania katalogiem głównym witryny.
źródło
Wyślij
HEAD
zapytanie do/wp-feed.php
tego samego katalogu co/xmlrpc.php
(nawet w instalacjach podkatalogowych). W WordPress otrzymaszLocation
nagłówek jako odpowiedź zawierającą ciągfeed
.W twoim przykładzie
blog.stackoverflow.com
otrzymasz:Samo istnienie pliku
xmlrpc.php
nie jest wystarczająco bezpieczne. Każdy może nadać tej nazwie plik.Uwaga:
X-Pingback
Nagłówek można wyłączyć, filtrując'wp_headers'
. Więc moja sugestia nie jest kuloodporna.Powiązane: Kroki, które należy podjąć, aby ukryć fakt, że witryna korzysta z WordPress?
źródło
X-Pingback:http://example.com/xmlrpc.php
w nagłówku wystarczająco silnego sygnału, by założyć, że to blog WP?xmlrpc.php
jest zawsze w tym samym katalogu,wp-feed.php
o ile widzę.wp-feed.php
jest lepsze.Dołącz adres URL
?page_id=-1
i wykonaj w tym celu żądanie HTTP HEAD .Na automatycznie instalowanych blogach WordPress spowoduje to odpowiedź 404.
Na blogach wordpress.com spowoduje to odpowiedź 301 (która zakończy się odpowiedzią 200, jeśli przekierujesz).
Na stronach innych niż WordPress powinieneś otrzymać odpowiedź 200 (zakładając, że oryginalny adres URL bez ciągu zapytania dał ci 200) - ciąg zapytania nie powinien mieć znaczenia.
Przykład z żądaniem HEAD dla
http://blog.stackoverflow.com/2011/03/a-new-name-for-stack-overflow-with-surprise-ending/?page_id=-1
:Przykład z żądaniem HEAD dla
http://dailycrave.wordpress.com/2012/06/01/three-cheese-grilled-pizza/?page_id=-1
(wyłącz przekierowania):(Uwaga jajko wielkanocne X-Hacker!)
Jeśli skorzystasz z przekierowania 301 dla bloga wordpress.com, skończysz z tym:
Zwróć uwagę na nagłówek „Link” zawierający
http://wp.me/
adres URL, który wydaje się być wspólny dla wszystkich blogów hostowanych przez wordpress.com i może być użyty do ich identyfikacji.Uważam, że to działa, ponieważ przekazanie
?page_id=-1
adresu URL zastępuje domyślny routing z segmentów adresu URL. Nie będzie strony o identyfikatorze -1, więc zamiast tego obsługiwane jest przekierowanie 404 /.źródło
page_id
już korzystać ze zmiennej. Każda metoda wykrywania przy użyciu nagłówków może być prawdopodobnie sfałszowana, więc nie sądzę, że warto się tym zbytnio przejmować. Co po prostu pozostawia fałszywe alarmy dla niestandardowego CMS. Nie mogłem wymyślić bardziej specyficznej dla WordPress zmiennej, której rzadziej można by użyć w innym miejscu. Czy jest jedenNie jest też dostępna wp-super-cache we wszystkich instalacjach wordpress, ani nie ma ustalonego formatu w adresach URL. Podczas gdy strona ustawień permalinks zawiera pewne stałe ustawienia schematów URL, których można użyć, każdy może po prostu użyć dowolnego niestandardowego schematu URL. Na przykład, jeśli ktoś po prostu zdecyduje się użyć tylko nazwy strony / postu w adresie URL, jest mniej więcej niemożliwe, aby dowiedzieć się, czy jest to witryna Wordpress.
Obecność xmlrpc może zostać wykorzystana do wykrycia, ale ponownie można to wyłączyć.
I wreszcie, nawet jeśli wykonasz pełny odczyt adresu URL, nadal nie jest w 100% możliwe wykrycie, czy strona jest zbudowana przy użyciu wordpress. Wszystko zależy od szablonu motywu i sposobu jego opracowania.
Jednym dość niezawodnym sposobem jest poszukiwanie obecności wp-login i wp-admin. Ale nawet te można również przenieść. Jednak wybrałbym tę drogę.
źródło
Dwie alternatywy dla komentarzy, ustaw własny nagłówek WordPress. Upuść to w pliku functions.php motywu.
Skaner linii papilarnych WP (ruby), przechodzi przez kilka kroków, aby dowiedzieć się, czy WordPress jest używany, na przykład szuka katalogu wtyczki, nazwy motywu, metatagów, pliku readme itp. (Nie mam pojęcia, jak dokładna jest to prawda ). http://code.google.com/p/wpscan/source/browse/#svn%2Ftrunk%2Flib%2Fwpscan
źródło
Co powiesz na wysłanie żądania głównego do jednego z plików rozpoczynającego się od prefiksu wp-. Najlepiej spójrz na wp-login.php. Jeśli istnieje, oznacza to, że w witrynie działa WordPress.
źródło
wp-login.php
może znajdować się w podfolderze.