WordPress应对棘手的垃圾评论

近期[8月1日起],我的博客收到大量垃圾评论,它们在WordPress后台中可看到的特征如下:

  1. 都以minecraft为姓名
  2. 邮箱很可能是随机生成
  3. IP地址很多,多为美国的家庭宽带
  4. 评论中无有效内容,皆是些"你的文章写的很好,我很喜欢看"(译)一类的屁话
  5. 链接通过短网址服务(及某些网站的重定向页面)跳转至一个minecraftm.com网站

结合其评论所使用的姓名,spammer大量发送垃圾评论的目的很可能是推广这个网站。这个网站提供免费的minecraft(及其插件)供访客下载——众所周知,minecraft是收费的专有软件——很少见破解站下如此大力度来做宣传。我不得不怀疑其动机(传播恶意软件等)

后来我透过SSH连接到服务器,检查Apache的访问日志,发现spammer所用的User-Agent(下简称:UA)没有有效的共同点,且几乎都是常见浏览器的——比如:

Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.183 Safari/537.36 Vivaldi/1.96.1147.42
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.18 Safari/537.36 OPR/55.0.2962.0 (Edition developer)
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/4FD9
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4882.400 QQBrowser/9.7.13036.400
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5383.400 QQBrowser/10.0.1313.400
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3298.4 Safari/537.36
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 OPR/52.0.2871.64 (Edition Campaign 34)
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36,gzip(gfe)

其发送频率很高,在这几天里,平均一小时能超过十条。我将minecraft添加至wordpress的评论人工审核列表,却又令我的邮箱的手机客户端响个不停。因此,我研究其实施方式,并设计如下方案以应对疯狂的spammer。


研究

Spammer大致用了如下方法,来防止网站的filter检测到其网址并对其评论加以屏蔽:

短网址服务(i) --> [某些网站的站外链接跳转页面(ii) --> 短网址服务(iii)]*N --> minecraftm.com(iv)

(ii)大致是这样的链接:http://www.london.umb.edu/?URL=goo.gl/sfuqXY,这利用某大学的站外链接跳转页面转至(iii)。

而这条跳转链中,除(iv)以外任何一点皆可作为起点,出现在垃圾评论的URL一栏中。


解决方案

一般地,正常的评论者若需要填写自己的URL(一般是博客/微博客等)时,不会使用短网址服务。我透过phpMyAdmin对我的Wordpress数据库运行了一些查询,确认了这一点——没有一条正常评论的发送者,在URL一栏使用了短网址服务。

因此,我大可以将一切URL栏里存在短网址的评论直接移到回收站而不必人工审核

这也适用于URL为跳转链接的评论(见上文),短网址服务(goo.gl/sfuqXY)在其中作为一个query parameter出现,PCRE会将其匹配到。

如果使用Wordpress自带的『黑名单』,这会导致正文里包含短网址服务的评论也被移至回收站——评论正文里有可能包含短网址服务,因此无法直接解决。

查询Wordpress与评论发送、评论删除相关的actions及functions后,我将如下内容添加至插件的function.php(也可以添加到主题的function.php):

function check_shorturl_spam($comment_id) {
	$comment_url = get_comment( $comment_id )->comment_author_url;
	$bad_url = [
		'goo.gl',
		'j.mp',
		'tinyurl.com',
		't.co',
		'bit.ly'
	];
	$bad_comment = FALSE;
	foreach ($bad_url as $i) {
		$bad_url_regex = preg_quote($i, '/');
		if (preg_match('/'.$bad_url_regex.'/', $comment_url)) {
			$bad_comment = TRUE;	
		}
	}

	if ($bad_comment == TRUE) {
		wp_delete_comment( $comment_id );
		http_response_code(403);
		exit('Dear spammer, don\'t be an asshole.');
	}
}
add_action( 'comment_post', 'check_shorturl_spam', 10, 1 );

以上代码将在检测到评论内容里包含短网址服务*时,返回HTTP 403和调侃spammer的话(Dear spammer, don't be an asshole.),并将其发送的垃圾评论移至回收站。

*:该spammer使用如下短网址服务:

  • goo.gl
  • j.mp
  • tinyurl.com
  • t.co
  • bit.ly

第二解决方案(更复杂,暂未实现)

(TBC)