如何在大量域上使用reCAPTCHA v2?

时间:2015-08-24 20:32:36

标签: captcha recaptcha

以前版本的reCAPTCHA提供了制作可在任何域上运行的全局密钥的选项。现在,在版本2中,该选项消失了,reCAPTCHA站点声称V2 API不支持"全局密钥。"

我正在使用大量可以在没有我干预的情况下经常更改的域名,而且我不想将每个新域添加到密钥中。

有没有办法让reCAPTCHA在没有专门授权每个域的情况下在任何域上工作?

2 个答案:

答案 0 :(得分:11)

可以在不验证每个域的情况下实施reCAPTCHA版本2.0:https://developers.google.com/recaptcha/docs/domain_validation

为此,请访问admin console,然后点击"您的reCAPTCHA网站"下的相关API密钥。然后在"高级设置"下,取消选中"验证reCAPTCHA解决方案的来源"。

安全警告

对于Google,这样做会产生安全风险,然后您需要自己check the hostname

  

关闭此保护本身会带来很大的安全风险 - 任何人都可以使用您的密钥,因为对其所在的网站没有任何限制。因此,在验证解决方案时,您需要check the hostname字段并拒绝任何来自意外来源的解决方案。

相关链接: (来自" Stack Exchange Information Security")
- Why bother validating the hostname for a Google Recaptcha response?

答案 1 :(得分:0)

注意:这适用于以前版本的reCAPTCHA API。有关更新的解决方案,请参阅其他答案。

这似乎并不为人所知,但是reCAPTCHA的文档提到可以使用Secure Token让一个密钥在大量域上运行。这个功能似乎是针对这种情况而设计的。

通过使用您的站点密码加密JSON字符串来创建它,但文档并未准确说明要使用的加密方法。这是我用过的一些PHP代码,用于在我的一个项目中使用它。这应该有助于您使用的任何语言。

$token = json_encode(array(
    'session_id' => bin2hex(openssl_random_pseudo_bytes(16)), // Random ID; no special format
    'ts_ms' => intval(round(microtime(true) * 1000))) // Time in milliseconds
);

$secret_key = '{reCAPTCHA secret key}';
$secret_key_hash = substr(hash('sha1', $secret_key, true), 0, 16);

$stoken_bin = openssl_encrypt(
    $token,
    'AES-128-ECB', // Encryption method
    $secret_key_hash,
    OPENSSL_RAW_DATA // Give me the raw binary
);

// URL-safe Base64 encode; change + to -, / to _, and remove =
$stoken = strtr(base64_encode($stoken_bin), array('+'=>'-', '/'=>'_', '='=>''));