Détecter une URL WordPress sans faire un HTTP GET complet?

21

J'essaie d'écrire une routine oneboxing qui accorde un traitement spécial aux entrées de blog WordPress. Donc, étant donné une URL simple, sans fioritures dans le contenu, tel que

  

enlace

Comment pourrais-je détecter qu'il s'agit d'une installation WordPress, idéalement sans effectuer un HTTP GET complet sur chaque URL que je vois?

Il existe certainement des conventions communes pour les URL WordPress avec lesquelles nous pourrions commencer, ce qui élimine au moins certaines URL du conflit. Dans ce cas, c’est ...

  

enlace

Mais ce n'est pas non plus une constante universelle.

J'ai essayé d'examiner les en-têtes de cette URL à l'aide de HTTP HEAD , et je vois:

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

Je ne pense pas que compter sur la présence de WP-Super-Cache serait particulièrement fiable. C’est la seule chose que je vois dans les en-têtes qui pourrait aider. Peut-être qu’il n’y a donc aucun en-tête HTTP commun dans une installation WordPress?

    
posée Jeff Atwood 07.06.2012 - 09:16

6 réponses

17

D'après mon expérience et la recherche rapide dans le code, il n'y a aucune manière délibérée de WP s'identifier dans les en-têtes. Cependant, certains semblent assez distincts et peu susceptibles d'être personnalisés.

HEAD to /wp-login.php contiendra les éléments suivants pour l'installation .org:

 Set-Cookie: wordpress_test_cookie=WP+Cookie+check; path=/

Et pour .com:

Set-Cookie: wordpress_test_cookie=WP+Cookie+check; path=/; domain=.wordpress.com

Le nom du cookie est personnalisable en définissant TEST_COOKIE constant, mais la chaîne WP Cookie check est codée en dur dans le noyau, de même que set_cookie() appelle cela dans le source du fichier.

Pour localiser wp-login.php , il existe des raccourcis d’URL (implémentés dans wp_redirect_admin_locations() depuis le WP 3.4 (voir ticket # 19607 ):

/login à la racine du site 302 est redirigé vers wp-login.php , où qu’il se trouve.

Ainsi, le seul scénario qui ne peut pas être détecté de manière fiable si WP est installé dans et est confiné au sous-répertoire, sans être utilisé pour gérer la racine du site.

    
réponse donnée Rarst 07.06.2012 - 09:31
12

Envoyez une demande HEAD à /wp-feed.php dans le même répertoire que /xmlrpc.php (même dans les installations de sous-répertoires). Dans WordPress, vous obtiendrez un en-tête Location sous forme de réponse contenant la chaîne feed .

Dans votre exemple pour blog.stackoverflow.com , vous obtiendrez:

HTTP/1.1 301 Moved Permanently\r\n
Date: Thu, 07 Jun 2012 07:30:10 GMT\r\n
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\r\n
X-Powered-By: PHP/5.2.6-2ubuntu4.2\r\n
Location: http://blog.stackoverflow.com/feed/\r\n
Vary: Accept-Encoding\r\n
Content-Type: text/html; charset=UTF-8\r\n
\r\n

La simple existence d'un fichier xmlrpc.php n'est pas suffisamment sûre. Tout le monde peut donner ce nom à un fichier.

Avertissement: l'en-tête X-Pingback peut être désactivé en filtrant 'wp_headers' . Donc, ma suggestion n'est pas à l'épreuve des balles.

En relation: Étapes à suivre pour masquer le fait qu'un site utilise WordPress?

    
réponse donnée fuxia 07.06.2012 - 09:28
6

Ajoutez l'URL avec ?page_id=-1 et faites une requête HTTP HEAD à cet effet.

Sur les blogs WordPress auto-installés, cela entraînera une réponse 404.

Sur les blogs de wordpress.com, cela se traduira par une réponse de 301 (qui aboutira à une réponse de 200 si vous suivez la redirection).

Sur les sites autres que WordPress, vous devriez obtenir une réponse 200 (en supposant que l'URL d'origine sans chaîne de requête vous en ait donné 200) - la chaîne de requête ne doit faire aucune différence.

Exemple avec une demande HEAD pour http://blog.stackoverflow.com/2011/03/a-new-name-for-stack-overflow-with-surprise-ending/?page_id=-1 :

HTTP/1.1 404 Not Found
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
Content-Encoding: gzip
Vary: Cookie,Accept-Encoding
Cache-Control: no-cache, must-revalidate, max-age=0
Last-Modified: Thu, 07 Jun 2012 08:53:01 GMT
Date: Thu, 07 Jun 2012 08:53:01 GMT
Keep-Alive: timeout=15, max=100
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Pragma: no-cache
Connection: Keep-Alive
X-Powered-By: PHP/5.2.6-2ubuntu4.2
X-Pingback: http://blog.stackoverflow.com/xmlrpc.php
Content-Type: text/html; charset=UTF-8

Exemple avec une demande HEAD pour http://dailycrave.wordpress.com/2012/06/01/three-cheese-grilled-pizza/?page_id=-1 (redirections désactivées):

HTTP/1.1 301 Moved Permanently
X-Pingback: http://dailycrave.wordpress.com/xmlrpc.php
Server: nginx
Expires: Wed, 11 Jan 1984 05:00:00 GMT
X-Hacker: If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.
Location: http://dailycrave.wordpress.com/2012/06/01/three-cheese-grilled-pizza/
Pragma: no-cache
Cache-Control: no-cache, must-revalidate, max-age=60
Connection: close
Last-Modified: Thu, 07 Jun 2012 09:01:09 GMT
Content-Type: text/html; charset=UTF-8
Date: Thu, 07 Jun 2012 09:01:09 GMT

(Notez l'oeuf de Pâques X-Hacker!)

Si vous suivez la redirection 301 pour le blog wordpress.com, vous obtenez ceci:

HTTP/1.1 200 OK
Server: nginx
Vary: Accept-Encoding, Cookie
Last-Modified: Thu, 07 Jun 2012 09:48:26 GMT
Cache-Control: max-age=172, must-revalidate
Connection: close
Date: Thu, 07 Jun 2012 09:50:34 GMT
Transfer-Encoding: Identity
Content-Encoding: gzip
Link: <http://wp.me/pXGqK-27g>; rel=shortlink
X-Pingback: http://dailycrave.wordpress.com/xmlrpc.php
Content-Type: text/html; charset=UTF-8
X-Nananana: Batcache
X-Hacker: If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.

Notez l'en-tête "Link" contenant l'URL http://wp.me/ , qui semble être commune à tous les blogs hébergés sur wordpress.com et pourrait être utilisée pour les identifier.

Je pense que cela fonctionne car le fait de passer ?page_id=-1 dans l'URL remplace le routage par défaut à partir des segments d'URL. Il n'y aura pas de page avec l'ID -1, et donc une redirection 404 / est servie à la place.

    
réponse donnée Nick 07.06.2012 - 11:04
3

wp-super-cache n’est pas non plus disponible sur toutes les installations de wordpress, et il n’existe aucun format fixe dans les URL. Bien que la page des paramètres permaliens donne certains paramètres fixes pour les modèles d'URL pouvant être utilisés, n'importe qui peut simplement utiliser n'importe quel modèle d'URL personnalisé. Par exemple, si quelqu'un décide simplement d'utiliser uniquement le nom de la page / publication dans l'URL, il est plus ou moins impossible de déterminer s'il s'agit d'un site Web Wordpress.

La présence de xmlrpc peut être utilisée pour détecter, mais encore une fois, cela peut être désactivé.

Enfin, même si vous obtenez un accès complet à l’URL, il n’est toujours pas possible de détecter à 100% si la page est construite à l’aide de wordpress. Tout dépend du modèle de thème et de son développement.

Un moyen assez fiable consiste à rechercher la présence de wp-login et de wp-admin. Mais même ceux-ci pourraient aussi être déplacés. J'irais de cette façon si.

    
réponse donnée Munim 07.06.2012 - 09:34
1

Deux alternatives aux commentaires, définissez votre propre en-tête WordPress. Déposez ceci dans le functions.php de votre thème.

add_action('template_redirect', 'add_wp_header');
function add_wp_header(){

header('Type: WordPress');
}

L’imprimante digitale WP scan (ruby), elle effectue plusieurs étapes pour essayer de savoir si WordPress est utilisé, par exemple pour rechercher le répertoire du plugin, le nom du thème, les balises META, le fichier Lisezmoi, etc. enlace

    
réponse donnée Wyck 07.06.2012 - 17:11
0

Pourquoi ne pas envoyer une demande d’en-tête à l’un des fichiers commençant par le préfixe wp-. Idéalement, regardez sur wp-login.php. S'il existe, cela signifie que le site Web utilise WordPress.

    
réponse donnée Mehulved 07.06.2012 - 09:45

Lire d'autres questions sur les étiquettes