Erkennen Sie eine WordPress-URL, ohne ein vollständiges HTTP-GET durchzuführen?

21

Ich versuche, eine Oneboxing-Routine zu schreiben, die WordPress-Blogeinträgen eine besondere Behandlung verleiht. Geben Sie also eine einfache, schmucklose URL in den Inhalt ein, wie z

http://blog.stackoverflow.com/2011/03/a-new-name-for-stack-overflow-with-surprise-ending/

Wie erkenne ich, dass dies eine WordPress-Installation ist, idealerweise ohne ein vollständiges HTTP-GET für jede URL, die ich sehe?

Es gibt sicherlich übliche Konventionen für WordPress-URLs, mit denen wir beginnen könnten, wodurch zumindest einige URLs von Konflikten ausgeschlossen werden. In diesem Fall ist es ...

http://example.com/year/month/slug-goes-here

Aber das ist auch keine universelle Konstante.

Ich habe versucht, die Überschriften dieser URL mit HTTP HEAD zu überprüfen und sehe:

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

Ich denke nicht, dass WP-Super-Cachees besonders zuverlässig wäre , sich auf das Vorhandensein von zu verlassen, und das ist das Einzige, was ich in den Headern sehe, das helfen würde. Vielleicht gibt es also keine gemeinsamen HTTP-Header in einer WordPress-Installation?

Jeff Atwood
quelle
Zur Verdeutlichung: Interessieren Sie sich nur für selbst gehostete .org-Installationen oder auch für .com?
Rarst
Alle WordPress-Installationen - Alle WordPress-Installationen
Jeff Atwood
1
Können Sie auf der zugehörigen RSS-Feed-Seite nach 200 suchen?
Kevin Burke
1
Warum genau willst du das? Sind falsch Positive oder falsch Negative schlimmer? Was ist mit einer Site, die die Seiten in Wordpress generiert und regelmäßig einen statischen Speicherauszug aller Seiten exportiert? (zB thespace.org )
rjmunro

Antworten:

17

Aus meiner Erfahrung und meiner schnellen Codesuche gibt es keine absichtlichen Möglichkeiten, wie sich WP in Headern identifiziert. Es gibt jedoch einige, die deutlich genug erscheinen und wahrscheinlich nicht angepasst werden.

HEAD to /wp-login.phpwird für .org install Folgendes enthalten:

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

Und für .com:

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

Der Cookie-Name kann durch Definieren einer TEST_COOKIEKonstante angepasst werden. Die WP Cookie checkZeichenfolge ist jedoch im Kern fest codiert und wird in set_cookie()der Quelle der Datei aufgerufen.

Zum Auffinden wp-login.phpgibt es einige URL-Verknüpfungen (implementiert wp_redirect_admin_locations()seit WP 3.4 (siehe Ticket # 19607 ):

/loginOn Site's Root 302leitet weiter wp-login.php, wo immer es ist.

Das einzige Szenario, das nicht zuverlässig erkannt werden kann, wenn WP in einem Unterverzeichnis installiert und darauf beschränkt ist, ohne dass das Stammverzeichnis der Site verwaltet wird.

Rarst
quelle
12

Senden Sie eine HEADAnfrage an /wp-feed.phpdasselbe Verzeichnis wie /xmlrpc.php(auch bei Installationen in Unterverzeichnissen). In WordPress erhalten Sie eine LocationKopfzeile als Antwort mit der Zeichenfolge feed.

In Ihrem Beispiel für erhalten blog.stackoverflow.comSie:

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

Das bloße Vorhandensein einer Datei xmlrpc.phpallein ist nicht sicher genug. Jeder kann einer Datei diesen Namen geben.

Vorsichtsmaßnahme: Der X-PingbackHeader kann durch Filtern deaktiviert werden 'wp_headers'. Mein Vorschlag ist also nicht kugelsicher.

Verwandte Themen: Schritte zum Ausblenden der Tatsache, dass eine Site WordPress verwendet?

fuxia
quelle
Wäre es nicht X-Pingback:http://example.com/xmlrpc.phpein starkes Signal , im Header zu sehen, dass es sich um ein WP-Blog handelt?
Jeff Atwood
Dies funktioniert für "standardmäßige" WordPress-Installationen. Sie können WordPress jedoch auch in einem Unterverzeichnis ausführen , wodurch diese Methode untergraben würde.
navitronic
1
@navitronic xmlrpc.phpbefindet sich wp-feed.phpsoweit ich sehen kann immer im selben Verzeichnis .
Fuxia
1
X-Pingback ist ein Standard-Header (ish) für alle Pingback-fähigen Ressourcen, nicht nur für WP.
NickFitz
@NickFitz Deshalb sollten Sie sich nicht nur auf die xmlrpc-Datei verlassen. Testen wp-feed.phpist besser.
Fuxia
6

Hängen Sie die URL an ?page_id=-1und führen Sie dafür eine HTTP-HEAD- Anfrage durch.

In selbst installierten WordPress-Blogs führt dies zu einer 404-Antwort.

Auf wordpress.com-Blogs führt dies zu einer 301-Antwort (die bei einer Antwort von 200 endet, wenn Sie der Umleitung folgen).

Auf Nicht-WordPress-Sites sollten Sie eine Antwort von 200 erhalten (vorausgesetzt, die ursprüngliche URL ohne die Abfragezeichenfolge hat 200 ergeben) - die Abfragezeichenfolge sollte keinen Unterschied machen.

Beispiel mit einer HEAD- Anfrage für 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

Beispiel mit einer HEAD- Anfrage für http://dailycrave.wordpress.com/2012/06/01/three-cheese-grilled-pizza/?page_id=-1(Follow Redirects deaktiviert):

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

(Beachten Sie das X-Hacker Osterei!)

Wenn Sie der 301-Umleitung für das Blog von wordpress.com folgen, erhalten Sie Folgendes:

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.

Beachten Sie den "Link" -Header mit der http://wp.me/URL, die allen von wordpress.com gehosteten Blogs gemeinsam zu sein scheint und zur Identifizierung dieser Blogs verwendet werden könnte.

Ich glaube, dass dies funktioniert, weil die Übergabe ?page_id=-1der URL das Standardrouting aus den URL-Segmenten überschreibt. Es gibt keine Seite mit der ID -1, daher wird stattdessen eine 404 / -Umleitung bereitgestellt.

Nick
quelle
2
Ich stelle mir vor, dass jede Website unter einer solchen URL umgeleitet oder weitergeleitet werden kann. Welches Verhalten ist hier spezifisch und identifiziert die Website als WP?
Rarst
@Rarst Ja - das ist die Einschränkung. Es ist für Websites möglich, dies zu fälschen, und es gibt möglicherweise einige, die die page_idVariable bereits verwenden. Jede Art von Erkennungsmethode, die Header verwendet, kann möglicherweise gefälscht werden, daher halte ich es nicht für wert, sich darüber Sorgen zu machen. Das hinterlässt nur Fehlalarme für benutzerdefiniertes CMS. Ich konnte mir keine WordPress-spezifischere Variable vorstellen, die mit geringerer Wahrscheinlichkeit woanders verwendet werden würde. Ist dort eines?
Nick
3

Weder ist wp-super-cache in allen WordPress-Installationen verfügbar, noch gibt es ein festes Format in den URLs. Während die Seite mit den Einstellungen für Permalinks einige feste Einstellungen für URL-Schemata enthält, kann jeder Benutzer einfach ein benutzerdefiniertes URL-Schema verwenden. Wenn zum Beispiel jemand nur den Namen der Seite / des Beitrags in der URL verwendet, ist es mehr oder weniger unmöglich herauszufinden, ob es sich um eine Wordpress-Website handelt.

Das Vorhandensein von xmlrpc kann zur Erkennung verwendet werden, dies kann jedoch ebenfalls deaktiviert werden.

Und selbst wenn Sie die URL vollständig abrufen, ist es immer noch nicht zu 100% möglich, festzustellen, ob die Seite mit WordPress erstellt wurde. Es hängt alles von der Themenvorlage und ihrer Entwicklung ab.

Ein ziemlich zuverlässiger Weg ist, nach wp-login und wp-admin zu suchen. Aber auch diese könnten verschoben werden. Ich würde diesen Weg gehen.

Munim
quelle
1

Zwei Alternativen zu den Kommentaren, setzen Sie Ihren eigenen WordPress-Header. Lege dies in die functions.php deines Themas.

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

header('Type: WordPress');
}

Beim WP-Scan-Fingerabdruck (Ruby) werden mehrere Schritte ausgeführt, um herauszufinden, ob WordPress verwendet wird, z. B. das Plugin-Verzeichnis, der Themenname, die Meta-Tags, die Readme-Datei usw. (ich habe keine Ahnung, wie genau dies tatsächlich ist) ). http://code.google.com/p/wpscan/source/browse/#svn%2Ftrunk%2Flib%2Fwpscan

Wyck
quelle
0

Wie wäre es, wenn Sie eine Kopfanforderung an eine der Dateien senden, die mit dem Präfix wp- beginnen. Im Idealfall schauen Sie sich wp-login.php an. Wenn es existiert, bedeutet dies, dass auf der Website WordPress ausgeführt wird.

Mehulved
quelle
wp-login.phpkönnte sich in einem Unterordner befinden.
Eugene Manuilov
Es könnte auch umgeleitet und daher umbenannt werden.
Kaiser