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

How can I use reCAPTCHA v2 on a large number of domains?

以前版本的 reCAPTCHA 提供了创建适用于任何域的全局密钥的选项。现在,在版本 2 中,该选项消失了,reCAPTCHA 网站声称 "Global Keys are not supported in the V2 API."

我正在处理大量域名,这些域名在没有我干预的情况下会经常更改,我不想将每个新域都添加到密钥中。

有没有办法让 reCAPTCHA 在任何域上工作而无需对每个域进行专门授权?

注意: 这适用于以前版本的 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('+'=>'-', '/'=>'_', '='=>''));

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

为此,请访问 admin console 并单击 "Your reCAPTCHA Sites" 下有问题的 API 键。然后在 "Advanced Settings" 下,取消选中 "Verify the origin of reCAPTCHA solutions".


安全警告

根据 Google,这样做会带来安全风险,需要您自己 check the hostname

Turning off this protection by itself poses a large security risk - your key could be taken and used by anyone, as there are no restrictions as to the site it's on. For this reason, when verifying a solution, you are required to check the hostname field and reject any solutions that are coming from unexpected sources.


相关Link:(来自“Stack Exchange Information Security”)
- Why bother validating the hostname for a Google Recaptcha response?