Estou tentando escrever uma rotina de oneboxing que dê tratamento especial às entradas de blog do WordPress. Portanto, dado um URL simples e sem adornos no conteúdo, como
http://blog.stackoverflow.com/2011/03/a-new-name-for-stack-overflow-with-surprise-ending/
Como eu detectaria que essa é uma instalação do WordPress, idealmente sem fazer um HTTP GET completo em todas as URLs que vejo?
Certamente, existem convenções comuns para URLs do WordPress que poderíamos começar, o que elimina pelo menos alguns URLs da contenção. Neste caso, é ...
Mas isso também não é uma constante universal.
Tentei olhar os cabeçalhos dessa URL usando HTTP HEAD e vejo:
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
Eu não acho que confiar na presença de WP-Super-Cache
seria particularmente confiável, e essa é a única coisa que vejo nos cabeçalhos que ajudaria, então talvez haja zero cabeçalhos HTTP comuns em uma instalação do WordPress?
Respostas:
Pela minha experiência e pesquisa rápida de código, não há maneiras deliberadas de o WP se identificar nos cabeçalhos. No entanto, existem alguns que parecem suficientemente distintos e que provavelmente não serão personalizados.
HEAD para
/wp-login.php
conterá o seguinte para a instalação .org:E para .com:
O nome do cookie é personalizável definindo
TEST_COOKIE
constante, mas aWP Cookie check
string é codificada no núcleo, assim comoset_cookie()
solicita isso na fonte do arquivo.Para localizar,
wp-login.php
existem alguns atalhos de URL (implementadoswp_redirect_admin_locations()
desde o WP 3.4 (consulte o ticket nº 19607 ):/login
na raiz do site302
redireciona parawp-login.php
, onde quer que esteja.Portanto, o único cenário que não pode ser detectado com segurança se o WP estiver instalado e limitado ao subdiretório, sem ser usado para gerenciar a raiz do site.
fonte
Envie uma
HEAD
solicitação para/wp-feed.php
o mesmo diretório que/xmlrpc.php
(mesmo em instalações de subdiretórios). No WordPress, você receberá umLocation
cabeçalho como resposta contendo a stringfeed
.No seu exemplo,
blog.stackoverflow.com
você obterá:A existência simples de um arquivo por
xmlrpc.php
si só não é segura o suficiente. Qualquer um pode dar esse nome a um arquivo.Advertência: O
X-Pingback
cabeçalho pode ser desativado por filtragem'wp_headers'
. Portanto, minha sugestão não é à prova de balas.Relacionados: etapas a serem tomadas para ocultar o fato de um site estar usando o WordPress?
fonte
X-Pingback:http://example.com/xmlrpc.php
no cabeçalho um sinal forte o suficiente para assumir que é um blog do WP?xmlrpc.php
está sempre no mesmo diretóriowp-feed.php
, tanto quanto eu posso ver.wp-feed.php
é melhor.Anexe a URL
?page_id=-1
e faça uma solicitação HTTP HEAD para isso.Em blogs WordPress auto-instalados, isso resultará em uma resposta 404.
Nos blogs wordpress.com, isso resultará em uma resposta 301 (que termina em 200 respostas se você seguir o redirecionamento).
Em sites que não são do WordPress, você deve obter uma resposta 200 (assumindo que o URL original sem a string de consulta deu 200) - a string de consulta não deve fazer diferença.
Exemplo com uma solicitação HEAD para
http://blog.stackoverflow.com/2011/03/a-new-name-for-stack-overflow-with-surprise-ending/?page_id=-1
:Exemplo com uma solicitação HEAD para
http://dailycrave.wordpress.com/2012/06/01/three-cheese-grilled-pizza/?page_id=-1
(siga os redirecionamentos desativados):(Observe o ovo de Páscoa do X-Hacker!)
Se você seguir o redirecionamento 301 do blog wordpress.com, terá o seguinte:
Observe o cabeçalho "Link" que contém a
http://wp.me/
URL, que parece ser comum a todos os blogs hospedados no wordpress.com e pode ser usada para identificá-los.Acredito que isso funcione porque a transmissão
?page_id=-1
no URL substitui o roteamento padrão dos segmentos de URL. Não haverá uma página com o ID -1 e, portanto, um 404 / redirecionamento é veiculado.fonte
page_id
já usem a variável. Qualquer tipo de método de detecção usando cabeçalhos provavelmente pode ser falsificado, então não acho que valha a pena se preocupar muito com isso. O que apenas deixa falsos positivos para o CMS personalizado. Eu não conseguia pensar em uma variável mais específica do WordPress que seria menos provável de ser usada em outro lugar. Existe um?O wp-super-cache também não está disponível em todas as instalações do wordpress, nem existe um formato fixo nos URLs. Enquanto a página de configurações de links permanentes fornece algumas configurações fixas para esquemas de URL que podem ser usados, qualquer um pode usar qualquer esquema de URL personalizado. Por exemplo, se alguém decide usar apenas o nome da página / postagem na URL, é mais ou menos impossível descobrir se é um site do Wordpress.
A presença do xmlrpc pode ser usada para detectar, mas, novamente, isso pode ser desativado.
E, finalmente, mesmo que você obtenha uma URL completa, ainda não é 100% possível detectar se a página foi criada usando o wordpress. Tudo depende do modelo do tema e de como ele é desenvolvido.
Uma maneira bastante confiável é procurar a presença wp-login e wp-admin. Mas mesmo estes também podem ser movidos. Eu iria por esse caminho embora.
fonte
Duas alternativas aos comentários, defina seu próprio cabeçalho no WordPress. Coloque isso em functions.php do seu tema.
O WP scan fingerprinter (ruby), ele percorre várias etapas para tentar descobrir se o WordPress está sendo usado, como procurar o diretório do plug-in, o nome do tema, as meta tags, o leia-me, etc. ) http://code.google.com/p/wpscan/source/browse/#svn%2Ftrunk%2Flib%2Fwpscan
fonte
Que tal enviar uma solicitação de cabeçalho para um dos arquivos começando com o prefixo wp-. Idealmente, veja wp-login.php. Se existir, significa que o site está executando o WordPress.
fonte
wp-login.php
pode estar localizado em uma subpasta.