我正在尝试编写一个onebox例程,该例程为WordPress博客条目提供特殊待遇。因此,给定一个简单的,未经修饰的内容URL,例如


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


我如何才能检测到这是WordPress安装,理想情况下无需对我看到的每个URL进行完整的HTTP GET?

当然,我们可以从WordPress URL的通用约定开始,这至少消除了某些URL的争用。在这种情况下是...


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


但是

我尝试使用HTTP HEAD查看该URL的标头,然后看到:

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


我认为依靠WP-Super-Cache的存在并不是特别可靠,这是我在标头中看到的唯一有用的东西,因此在WordPress安装中可能只有零个常见的HTTP标头?

评论

需要澄清的是-您只对.org自托管安装感兴趣,还是对.com也感兴趣?

所有WordPress安装-任何WordPress安装

您可以在相关的RSS供稿页面上检查200个吗?

你到底为什么要这个?误报或误报是否更糟?一个在Wordpress中生成页面并定期导出所有页面的静态转储的网站呢? (例如thespace.org)

#1 楼

根据我的经验和快速的代码搜索,WP没有在标头中标识其自身的故意方式。但是,有些似乎足够独特并且不太可能进行自定义。

/wp-login.php的HEAD将包含用于.org安装的以下内容:

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


对于.com:

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


通过定义TEST_COOKIE常量可自定义Cookie名称,但是WP Cookie check字符串在内核中是硬编码的,并且set_cookie()在文件的名称中对此进行了调用

要定位wp-login.php,有一些URL快捷方式(自WP 3.4起在wp_redirect_admin_locations()中实现(请参见票证#19607):

网站根目录上的/login302重定向到wp-login.php

因此,只有在未将WP用于管理站点根目录的情况下,将WP安装并限制在子目录中,该唯一无法可靠检测的方案。

#2 楼

在与HEAD相同的目录中发送/wp-feed.php请求至/xmlrpc.php(即使在子目录安装中)。在WordPress中,您将获得一个Location标头作为响应,其中包含字符串feed。在您的blog.stackoverflow.com示例中,您将获得:

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


仅仅存在文件xmlrpc.php不够安全。任何人都可以将此名称赋予文件。

注意:可以通过过滤X-Pingback来禁用'wp_headers'标头。所以我的建议不是防弹的。

相关:隐藏网站使用WordPress的事实的步骤?

评论


会不会在标题中看到X-Pingback:http://example.com/xmlrpc.php足以表明它是WP博客?

–杰夫·阿特伍德
2012年6月7日7:30

这将适用于“默认” wordpress安装,但是您也可以在子目录中运行wordpress,这会破坏此方法。

–航电
2012年6月7日7:30

据我所知,@ navitronic xmlrpc.php始终与wp-feed.php位于同一目录中。

– fuxia♦
2012年6月7日在7:36

X-Pingback是所有启用pingback的资源(不仅仅是WP)的标准标头。

– NickFitz
2012年6月7日在7:36

@NickFitz这就是为什么您不应该仅依赖xmlrpc文件的原因。测试wp-feed.php更好。

– fuxia♦
2012年6月7日在7:38

#3 楼

在URL上附加?page_id=-1并为此执行HTTP HEAD请求。

在自行安装的WordPress博客上,这将导致404响应。

在wordpress.com博客上,这将导致301响应(如果您按照重定向进行操作,最终将获得200响应)。

在非WordPress网站上,您应该得到200的响应(假设原始URL不带查询字符串,则您得到200)-查询字符串应该没有区别。

带有HEAD请求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


带有HEAD请求http://dailycrave.wordpress.com/2012/06/01/three-cheese-grilled-pizza/?page_id=-1(跟随重定向已关闭)的示例:

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


(请注意X-Hacker复活节egg!)

如果您遵循wordpress.com博客的301重定向,则会遇到以下问题:

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.


注意“ “链接”标头包含http://wp.me/ URL,它似乎是所有wordpress.com托管博客所共有的URL,可以用来识别它们。

我相信这是可行的,因为在URL中传递?page_id=-1会覆盖默认路由来自网址细分。不会有ID为-1的页面,因此将提供404 /重定向。

评论


我想象在那里的任何站点都可以在此类URL处重定向或404,这是什么特定行为,并将站点标识为WP?

–稀有
2012年6月7日9:09

@Rarst是的-这是警告。网站可能会欺骗它,并且可能有些网站已经在使用page_id变量。任何使用标头的检测方法都可能被欺骗,因此我认为不必为此担心太多。这只会给自定义CMS带来误报。我想不到一个更特定于WordPress的变量,该变量不太可能在其他地方使用。有一个吗?

–尼克
2012年6月7日在9:16



#4 楼

wp-super-cache并非在所有wordpress安装中都可用,URL中也没有任何固定格式。虽然永久链接设置页面确实提供了可以使用的URL方案的一些固定设置,但任何人都可以使用任何自定义URL方案。例如,如果任何人只是决定仅使用URL中的页面/帖子名称,则几乎无法确定它是否是Wordpress网站。

xmlrpc的存在可用于检测,但是再次可以将其禁用。

最后,即使您对URL进行了完全获取,也仍然不可能100%地检测到页面是否使用wordpress构建。这完全取决于主题模板及其开发方式。

一种相当可靠的方法是查找状态wp-login和wp-admin。但是,即使这些也可以移动。我会选择这种方式。

#5 楼

注释有两种选择,设置您自己的WordPress标头。将其放在主题的functions.php中。

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

header('Type: WordPress');
}


WP扫描指纹识别器(红宝石),它通过几个步骤来尝试确定是否正在使用WordPress等。在寻找插件目录,主题名称,元标记,自述文件等时(我不知道这实际上有多准确)。http://code.google.com/p/wpscan/source/browse/#svn%2Ftrunk %2Flib%2Fwpscan

#6 楼

如何向文件前缀wp-开头的文件之一发送头请求。
理想地看wp-login.php。如果存在,则表示该网站正在运行WordPress。

评论


wp-login.php可以位于子文件夹中。

– Eugene Manuilov
2012年6月7日在7:48

它也可以被重定向,因此被重命名。

– kaiser
2012年8月24日13:54