可靠地检测基于PhantomJS的垃圾邮件机器人

时间:2013-12-31 20:11:03

标签: phantomjs mediawiki casperjs spam spam-prevention

有没有办法持续检测PhantomJS / CasperJS?我一直在处理一堆用它构建的恶意垃圾邮件,并且已经能够基于某些行为阻止它们,但我很好奇是否有一种坚如磐石的方式来了解CasperJS是否正在使用中,如同处理不断的适应变得有点烦人。

我不相信使用Captchas。他们是负面的用户体验,ReCaptcha从未在我的MediaWiki安装上阻止垃圾邮件。由于我们的网站没有用户注册(匿名讨论板),我们需要为每个帖子都有一个Captcha条目。我们每天都会收到数千个合法的帖子,而且Captcha会看到这个号码的下潜。

3 个答案:

答案 0 :(得分:21)

我非常赞同你对CAPTCHA的看法。我将列出我迄今为止能够检测到的内容,以及我自己的检测脚本,具有类似的目标。它只是部分的,因为它们更多headless browsers

使用公开的窗口属性来检测/假设那些特定的无头浏览器是相当安全的:

window._phantom (or window.callPhantom) //phantomjs
window.__phantomas //PhantomJS-based web perf metrics + monitoring tool 
window.Buffer //nodejs
window.emit //couchjs
window.spawn  //rhino

以上是从jslint doc收集并使用幻影js进行测试。

浏览器自动化驱动程序(由BrowserStack或其他Web捕获服务用于快照):

window.webdriver //selenium
window.domAutomation (or window.domAutomationController) //chromium based automation driver

这些属性并不总是暴露出来,我正在寻找其他更强大的方法来检测这样的机器人,我可能会在完成后将其作为完整的脚本发布。但这主要回答了你的问题。

这是另一个相当合理的方法来更广泛地检测JS无头浏览器:

if (window.outerWidth === 0 && window.outerHeight === 0){ //headless browser }

这应该可以正常工作,因为默认情况下属性为 ,即使无头浏览器设置虚拟视口大小,默认情况下 也无法报告大小不存在的浏览器窗口特别是Phantom JS doesn't support outerWith or outerHeight

ADDENDUM:但是有一个Chrome / Blink错误,包含outer / innerDimensions。 Chromium does not report those dimensions when a page loads in a hidden tab,例如从上次会话恢复时。 Safari似乎没有这个问题。

更新:原来iOS Safari 8+有一个外部宽度和错误的错误outerHeight为0,还有一个Sailfish webview也可以。因此,虽然它是一个信号,但如果不注意这些错误就不能单独使用它。因此,警告:除非您确实知道自己在做什么,否则请不要使用此原始代码段。

PS:如果您知道此处未列出的其他无头浏览器属性,请分享评论。

答案 1 :(得分:3)

没有坚如磐石的方式:PhantomJS和Selenium只是用来控制浏览器软件的软件,而不是用户控制它。

特别是PhantomJS 1.x,我相信有一些JavaScript可以用来破坏利用WebKit版本中的错误的浏览器(它相当于Chrome 13,所以很少有真正的用户应该被影响)。 (我记得几个月前在Phantom邮件列表中提到了这个,但我不知道是否描述了使用的确切JS。)更一般地说,你可以使用用户代理匹配功能检测的组合。例如。如果浏览器声称自己是“Chrome 23”但没有Chrome 23所具有的功能(并且Chrome 13没有),则会产生怀疑。

作为用户,我也讨厌CAPTCHA。但它们非常有效,因为它们增加了垃圾邮件发送者的成本:他必须编写更多软件或雇用人来阅读它们。 (这就是为什么我认为简单的CAPTCHA足够好了:那些惹恼用户的是那些你不知道它说什么并且不得不继续按重新加载以获得你认可的东西的原因。)

一种方法(我相信Google使用的方法)是有条件地显示CAPTCHA。例如。登录的用户永远不会被显示出来。已经在此会话中发布一个帖子的用户不会再次显示。来自白名单中的IP地址的用户(可以从先前的合法帖子构建)不会显示它们。或者相反,只需从IP范围的黑名单中向用户显示它们。

我知道这些方法都不完美,对不起。

答案 2 :(得分:3)

您可以通过检查window.callPhantom属性来检测客户端上的幻像。最小的脚本在客户端是:

var isPhantom = !!window.callPhantom;

这是一个gist with proof of concept

垃圾邮件发送者可能会尝试使用page.evaluate删除此属性,然后这取决于谁更快。在您尝试检测之后,根据您的检测结果,您是否使用帖子表格和验证码进行重新加载。

问题是您需要重定向可能会惹恼您的用户。这对于客户端上的每种检测技术都是必要的。哪个可以使用onResourceRequested进行破坏和更改。

通常,我不认为这是可能的,因为您只能在客户端上检测并将结果发送到服务器。添加CAPTCHA与仅有一个页面加载的检测步骤相结合并不能真正添加​​任何内容,因为它可以通过phantomjs / casperjs轻松删除。基于用户代理的防御也没有意义,因为它可以在phantomjs / casperjs中轻松更改。