¿Detecta una URL de WordPress sin hacer un HTTP GET completo?

21

Estoy tratando de escribir una rutina de oneboxing que le dé a las entradas del blog de WordPress un tratamiento especial. Por lo tanto, se le asigna una URL simple y sin adornos en el contenido, como

  

enlace

¿Cómo detectaría que esto es una instalación de WordPress, idealmente sin hacer un HTTP GET completo en cada URL que veo?

Ciertamente hay convenciones comunes para las URL de WordPress con las que podríamos comenzar, lo que elimina al menos algunas URL de la contención. En este caso es ...

  

enlace

Pero eso tampoco es una constante universal.

Intenté mirar los encabezados de esa URL usando HTTP HEAD , y veo:

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

No creo que confiar en la presencia de WP-Super-Cache sea particularmente confiable, y eso es lo único que veo en los encabezados que ayudaría, ¿entonces tal vez hay cero encabezados HTTP comunes en una instalación de WordPress?

    
pregunta Jeff Atwood 07.06.2012 - 09:16

6 respuestas

17

Según mi experiencia y la búsqueda rápida de códigos, no hay deliberadas formas en que WP se identifica en los encabezados. Sin embargo, hay algunos que parecen lo suficientemente distintos y no es probable que se personalicen.

HEAD to /wp-login.php contendrá lo siguiente para la instalación de .org:

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

Y para .com:

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

El nombre de la cookie se puede personalizar definiendo TEST_COOKIE constante, pero la cadena WP Cookie check está codificada en el núcleo, así como la llamada set_cookie() para la fuente del archivo.

Para localizar wp-login.php hay algunos accesos directos de URL (implementados en wp_redirect_admin_locations() desde WP 3.4 (vea el ticket # 19607 ):

/login en la raíz del sitio redirige 302 a wp-login.php , donde sea que esté.

Por lo tanto, el único escenario que no se puede detectar de manera confiable si WP se instala en y se limita a un subdirectorio, sin que se use para administrar la raíz del sitio.

    
respondido por el Rarst 07.06.2012 - 09:31
12

Envíe una solicitud HEAD a /wp-feed.php en el mismo directorio que /xmlrpc.php (incluso en instalaciones de subdirectorios). En WordPress obtendrás un encabezado Location como respuesta que contiene la cadena feed .

En su ejemplo para blog.stackoverflow.com obtendrá:

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 existencia de un archivo xmlrpc.php solo no es lo suficientemente segura. Cualquiera puede dar este nombre a un archivo.

Advertencia: el encabezado X-Pingback se puede desactivar al filtrar 'wp_headers' . Así que mi sugerencia no es a prueba de balas.

Relacionado: ¿Pasos a seguir para ocultar el hecho de que un sitio utiliza WordPress?

    
respondido por el fuxia 07.06.2012 - 09:28
6

Agregue la URL con ?page_id=-1 y haga una solicitud de HTTP HEAD para eso.

En los blogs de WordPress autoinstalados, esto dará como resultado una respuesta 404.

En los blogs de wordpress.com, esto resultará en una respuesta 301 (que termina en una respuesta 200 si sigues la redirección).

En sitios que no sean de WordPress, debería obtener una respuesta 200 (asumiendo que la URL original sin la cadena de consulta le dio 200) - la cadena de consulta no debe hacer ninguna diferencia.

Ejemplo con una solicitud HEAD para 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

Ejemplo con una solicitud HEAD para http://dailycrave.wordpress.com/2012/06/01/three-cheese-grilled-pizza/?page_id=-1 (siga las redirecciones desactivadas):

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

(¡Observa el huevo de Pascua de X-Hacker!)

Si sigue la redirección 301 para el blog de wordpress.com, terminará con esto:

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.

Tenga en cuenta el encabezado "Enlace" que contiene la URL http://wp.me/ , que parece ser común a todos los blogs alojados en wordpress.com y podría usarse para identificarlos.

Creo que esto funciona porque pasar ?page_id=-1 en la URL anula el enrutamiento predeterminado de los segmentos de URL. No habrá una página con el ID de -1, por lo que se sirve un 404 / redirect en su lugar.

    
respondido por el Nick 07.06.2012 - 11:04
3

Ni wp-super-cache está disponible en todas las instalaciones de wordpress, ni hay ningún formato fijo en las URL. Si bien la página de configuración de los enlaces permanentes brinda algunas configuraciones fijas para los esquemas de URL que pueden usarse, cualquiera puede usar cualquier esquema de URL personalizado. Por ejemplo, si alguien decide usar solo el nombre de la página / publicación en la URL, es más o menos imposible averiguar si se trata de un sitio web de Wordpress.

La presencia de xmlrpc se puede usar para detectar, pero nuevamente, esto se puede desactivar.

Y, por último, incluso si obtiene un acceso completo a la URL, todavía no es posible detectar al 100% si la página se ha creado con wordpress. Todo depende de la plantilla del tema y de cómo se desarrolle.

Una forma bastante confiable es buscar la presencia de wp-login y wp-admin. Pero incluso estos también podrían ser movidos. Aunque yo iría por este camino.

    
respondido por el Munim 07.06.2012 - 09:34
1

Dos alternativas a los comentarios, establece tu propio encabezado de WordPress. Suelta esto en las funciones de tu tema.php.

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

header('Type: WordPress');
}

El WP scan fingerprinter (ruby), pasa por varios pasos para intentar averiguar si se está utilizando WordPress, como buscar el directorio de complementos, el nombre del tema, las etiquetas meta, el léame, etc. (No tengo idea de cuán precisa es esto es en realidad). enlace

    
respondido por el Wyck 07.06.2012 - 17:11
0

¿Qué hay de enviar una solicitud principal a uno de los archivos que comienzan con el prefijo wp-. Lo ideal es mirar wp-login.php. Si existe, significa que el sitio web está ejecutando WordPress.

    
respondido por el Mehulved 07.06.2012 - 09:45

Lea otras preguntas en las etiquetas