Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可靠地检测基于PhantomJS的垃圾邮件机器人_Phantomjs_Mediawiki_Casperjs_Spam_Spam Prevention - Fatal编程技术网

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

可靠地检测基于PhantomJS的垃圾邮件机器人,phantomjs,mediawiki,casperjs,spam,spam-prevention,Phantomjs,Mediawiki,Casperjs,Spam,Spam Prevention,是否有任何方法可以始终如一地检测PhantomJS/CasperJS?我一直在处理大量使用它构建的恶意垃圾邮件,并且基本上能够基于某些行为来阻止它们,但我很好奇是否有可靠的方法来知道CasperJS是否正在使用,因为处理不断的适应变得有点烦人 我不相信使用CAPTCHA。这是一种负面的用户体验,ReCaptcha从未在我的MediaWiki安装中阻止垃圾邮件。由于我们的网站没有用户注册(匿名讨论板),我们需要为每一篇文章提供验证码条目。我们每天都会收到几千条合法的帖子,一个验证码就会看到这个数字

是否有任何方法可以始终如一地检测PhantomJS/CasperJS?我一直在处理大量使用它构建的恶意垃圾邮件,并且基本上能够基于某些行为来阻止它们,但我很好奇是否有可靠的方法来知道CasperJS是否正在使用,因为处理不断的适应变得有点烦人


我不相信使用CAPTCHA。这是一种负面的用户体验,ReCaptcha从未在我的MediaWiki安装中阻止垃圾邮件。由于我们的网站没有用户注册(匿名讨论板),我们需要为每一篇文章提供验证码条目。我们每天都会收到几千条合法的帖子,一个验证码就会看到这个数字是divebomb。

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

特别是在PhantomJS 1.x中,我相信有一些JavaScript可以用来破坏浏览器,利用正在使用的WebKit版本中的漏洞(它相当于Chrome 13,因此很少有真正的用户会受到影响)。(我记得几个月前在Phantom邮件列表中提到过这一点,但我不知道是否描述了要使用的确切JS。)更一般地说,您可以使用用户代理与功能检测相匹配的组合。例如,如果一个浏览器声称是“Chrome 23”,但没有Chrome 23具备的功能(Chrome 13也没有),那么就要怀疑

作为一个用户,我也讨厌验证码。但它们非常有效,因为它们增加了垃圾邮件发送者的成本:他必须编写更多的软件或雇佣人阅读。(这就是为什么我认为简易验证码足够好的原因:让用户恼火的是那些你不知道它在说什么,并且必须不断按“重新加载”以获得你能识别的东西的验证码。)

一种方法(我相信谷歌使用的)是有条件地显示验证码。例如,登录的用户永远不会显示它。已在此会话中发布过一篇文章的用户不会再次显示。来自白名单中IP地址的用户(可以从以前的合法帖子生成)不会显示给他们。或者相反,只需将它们显示给IP范围黑名单中的用户即可


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

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

var isPhantom=!!window.callPhantom;
这是一个有效的方法

垃圾邮件发送者可以尝试使用
页面删除此属性。请评估
,然后这取决于谁更快。尝试检测后,根据检测结果,使用post表单和CAPTCHA重新加载

问题是,您会导致重定向,这可能会激怒您的用户。这对于客户端上的每种检测技术都是必要的。它可以被颠覆和改变


一般来说,我认为这是不可能的,因为您只能在客户机上检测并将结果发送到服务器。只需加载一个页面就可以将验证码与检测步骤相结合,但实际上并没有添加任何内容,因为它可以通过phantomjs/casperjs轻松删除。基于用户代理的防御也没有意义,因为它可以在phantomjs/casperjs中轻松更改。

我非常赞同您对验证码的看法。我将列出到目前为止我已经能够检测到的东西,作为我自己的检测脚本,具有类似的目标。这只是部分原因,因为它们还有很多

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

window._phantom (or window.callPhantom) //phantomjs
window.__phantomas //PhantomJS-based web perf metrics + monitoring tool 
window.Buffer //nodejs
window.emit //couchjs
window.spawn  //rhino
以上是从phantom js收集和测试的

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

这些属性并不总是公开的,我正在研究其他更健壮的方法来检测这样的机器人,完成后我可能会发布完整的脚本。但这主要回答了你的问题

下面是另一个相当合理的方法,可以更广泛地检测支持JS的无头浏览器:

if (window.outerWidth === 0 && window.outerHeight === 0){ //headless browser }
这应该可以很好地工作,因为默认情况下,即使无头浏览器设置了虚拟视口大小,属性也为0,并且默认情况下,它不能报告不存在的浏览器窗口的大小。特别是Phantom JS

附录:然而,有一个外部/内部尺寸的Chrome/Blink缺陷。铬,例如从上一个会话还原时。Safari似乎没有这个问题

更新:iOS Safari 8+有一个错误,外径和外径为0,而旗鱼网络视图也可以。因此,虽然它是一种信号,但如果不注意这些错误,就不能单独使用它。因此,警告:除非您真的知道自己在做什么,否则请不要使用此原始代码段


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

页面不向窗口公开。这是一个请求实际页面的内部phantomjs属性。问题是当使用phantomjs执行页面时,如何从js窗口范围检测phantomjs。这只是为了说明检测器的工作原理。如果代码看起来有点混乱,我会减少代码。在我正在调查的案例中,
navigator.onLine
属性为FALSE(PhantomJS也是如此)。我测试的常规浏览器在联机时都返回TRUE。另外,
navigator.plugins
在我的例子中是空的,这也与PhantomJS一致。@PeterK谢谢<代码>导航器。插件
只能被仔细地视为附加的组合信号。因为它在许多移动环境中也是空的,最终在将来的一些台式机上也是空的。
navigator.plugins
确实是一个薄弱的证据。在我们的测试中,IE11和Android Chrome没有报告任何插件,桌面Chrome和Firefox没有报告。这对我们有利,但是,b
if (window.outerWidth === 0 && window.outerHeight === 0){ //headless browser }