当前位置

Drupal网站启用Google Recaptcha屏蔽垃圾

James Qi 在 2019年7月5日 - 09:00 提交

  Drupal网站的反垃圾一直是个问题,包括页面留言、登录、注册、网站联络等,如果不使用任何反垃圾措施,很快就会被垃圾发送者的信息淹没。🤬

  前几年记录过一篇文章《Drupal反垃圾模块的选择》,以前安装过captcha、botcha、honeypot、Mollom、BlockAnonymousLinks等,不过spammer也在不断提高技术,普通的算术或者图片验证码已经不能对付厉害的垃圾发送者了,如果继续加大图片复杂程度的话,对想留言的普通用户很不友好。

  前几天有朋友留言让我试一试Google Recaptcha,这个Google出品的验证方式我自己在一些Google产品上有过体验,既然是Google推出的,技术上应该是顶级的,但我记得需要翻墙的时候才会看到验证提示,如果在国内使用就看不到而无法使用。

  感谢留言的朋友也告诉我可以有替换的网址,只要简单替换一下就可以,于是我这两天先在我的博客上尝试了安装Google reCAPTCHA,需要到Google recaptcha网站上注册账号、添加域名,我访问一看,居然几年前我就添加过几个域名,后来都已经遗忘了,于是重新添加域名,reCAPTCHA 类型还是选择的v2,获得reCAPTCHA密钥,包括40位长度的公钥和私钥,填写到Drupal google recaptcha的配置中。

  在网上搜了一下,recaptcha.net可以作为www.google.com相关服务的反向代理域名,于是在google recaptcha模块中修改了google_recaptcha.under_hood.inc这个文件里面的两个地方:

  //jamesqi 2019-7-4//$url = 'https://www.google.com/recaptcha/api.js?onload=google_recaptcha_onload&render=explicit';
  $url = 'https://recaptcha.net/recaptcha/api.js?onload=google_recaptcha_onload&render=explicit';

  //jamesqi 2019-7-4//$ch = curl_init('https://www.google.com/recaptcha/api/siteverify');
  $ch = curl_init('https://recaptcha.net/recaptcha/api/siteverify');
  这样在国内、国外都可以看到了,实际使用中与我自己使用Google的一些服务遇到验证是一样的,有时无需任何验证,有时需要选择几个图片:
  在Drupal这个模块的后台以及Google recaptcha的控制面板中都可以看到使用的数据统计,包括验证成功、失败的次数等。
看上去应该是不错的,准备后面再到更多的Drupal网站中运用。另外,除了google recaptcha这个模块以外,还有一个recaptcha模块使用人数更多,并同时支持Drupal 6、Drupal 7和Drupal 8,那就准备使用后面这个。
  补充:后面这个模块连google.com的域名都不需要改,只需要在设置中选择:Enable this in circumstances when "www.google.com" is not accessible, e.g. China.,这就更方便了。👍😁

  2019年7月8日补充:用drush来批量设置recaptcha支持的办法:

drush en -y recaptcha

drush vset captcha_default_challenge "recaptcha/reCAPTCHA"

drush vset recaptcha_verify_hostname 1
drush vset recaptcha_use_globally 1
drush vset recaptcha_type "image"
drush vset recaptcha_theme "light"
drush vset recaptcha_tabindex "0"
drush vset recaptcha_size ""
drush vset recaptcha_site_key "6LeI......klHb"
drush vset recaptcha_secret_key "6LeI......1c9U"
drush vset recaptcha_noscript 1

  对应的设置效果如下:


  2019年7月12日补充:发现国内服务器上安装的recaptcha模块虽然可以正常显示验证码并且通过“进行人机身份验证”,但提交表单的时候还是报错“您所输入的验证码答案不正确。”,而安装在国外的服务器上没有这个问题。仔细排查后找到需要改的地方:

  sites/all/modules/recaptcha/src/ReCaptcha/RequestMethod/Drupal7Post.php 这个文件的下面部分:

...
   public function submit(RequestParameters $params) {

    $options = array(
      'headers' => array(
        'Content-type' => 'application/x-www-form-urlencoded',
      ),
      'method' => 'POST',
      'data' => $params->toQueryString(),
      'context' => stream_context_create(array('ssl' => array('verify_peer' => FALSE, 'verify_peer_name' => FALSE),)),
    );
    //jamesqi 2019-7-12//$response = drupal_http_request(ReCaptcha::SITE_VERIFY_URL, $options);
    $response = drupal_http_request('https://recaptcha.net/recaptcha/api/siteverify', $options);

    if ($response->code == 200 && isset($response->data)) {
      // The service request was successful.
      return $response->data;
    } 
...

  这样就OK了。


  2019年7月19日国内Drupal 8网站下安装recaptcha,需要修改/www/adsensebook.cn/modules/recaptcha/recaptcha-php/src/ReCaptcha/ReCaptcha.php:

    /**
     * URL for reCAPTCHA sitevrerify API
     * @const string
     */
    //const SITE_VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify';
    const SITE_VERIFY_URL = 'https://recaptcha.net/recaptcha/api/siteverify';//jamesqi 2019-7-18

   2021年4月12日补充:适合Google Recaptcha v3的Drupal插件也有了,Drupal 7和Drupal 8都支持。


   2022年8月18日补充:最近把一些网站中使用的v2升级到v3了,新记录了一篇《Drupal中使用Google Recaptcha V3屏蔽垃圾》。

 

评论

确实很不错,我安装了recaptcha插件的几个网站这几天基本上看不到垃圾留言和通过反馈表单发来的垃圾邮件了。✌

在google recaptcha管理面板可以看到屏蔽了很多。👍

James Qi / 祁劲松

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。