之前的reCAPTCHA版本提供了创建全局密钥的选项,可以在任何域上使用。但是,在版本2中,此选项已经取消,并且reCAPTCHA网站声称“V2 API不支持全局密钥”。我正在处理大量可能会频繁更改而无需干预的域名,我不想每次都添加新域名到密钥中。是否有一种方法可以让reCAPTCHA在未明确授权每个域名的情况下在任何域上工作?
仅关闭此保护本身就会带来巨大的安全风险-你的密钥可以被任何人拿走并使用,因为没有对其所在网站进行限制。出于这个原因,当验证解决方案时,需要检查主机名字段,并拒绝来自意外来源的任何解决方案。
相关链接: (来源于"Stack Exchange信息安全")
- 为什么要验证Google reCAPTCHA响应的主机名?
注意:此适用于 reCAPTCHA API 的早期版本。请查看其他答案以获取更新的解决方案。
这好像不是很出名,但 reCAPTCHA 的文档提到可以使用安全令牌使一个密钥在多个域上工作。这个功能似乎恰好就是为这种情况设计的。
它是通过使用您站点的秘密加密 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('+'=>'-', '/'=>'_', '='=>''));