slushie/recaptcha-secure-token

生成与 ReCaptcha 兼容的安全令牌

1.1.1 2015-10-07 16:13 UTC

This package is not auto-updated.

Last update: 2024-09-18 09:36:10 UTC


README

这个库提供了一个 PHP 实现,用于 ReCaptcha v2 安全令牌 算法。

用法

您应该在 composer 的 require 部分添加此库

"require": {
  "slushie/recaptcha-secure-token": "~1.0",
  /* ... */
}

在您的 PHP 代码中,您可以通过传递您的 site_keysite_secret 值来创建一个 ReCaptchaToken 类的实例

$config = ['site_key' => 'YOUR_SITE_KEY', 'site_secret' => 'YOUR_SITE_SECRET'];
$recaptchaToken = new \ReCaptchaSecureToken\ReCaptchaToken($config);

要生成一个 安全令牌,您必须提供一个唯一的 session_id

$sessionId = uniqid('recaptcha');
$secureToken = $recaptchaToken->secureToken($sessionId);

最后,将此令牌值用于您的 HTML 输出。例如

<div class="g-recaptcha" 
     data-sitekey="YOUR_SITE_KEY"
     data-stoken="<?php echo $secureToken ?>"></div>

时间戳

作为一个基于时间的协议,时间戳必须准确。如果您的系统时钟不准确(尝试 ntpdate),您必须传递一个准确的时间戳(以毫秒为单位)到 secureToken。您可以从一个 NTP 服务器获取一个,例如。

$socket = new Bt51\NPM\Socket('0.pool.ntp.org', 123);
$ntp_client = new Bt51\NPM\Client($socket);
$timestamp = $ntp_client->getTime()->getTimestamp() * 1000;

$sessionId = uniqid('recaptcha');
$secureToken = $recaptchaToken->secureToken($sessionId, $timestamp);

算法实现

原始 ReCaptcha 算法没有文档说明,尽管提供了 Java 代码示例

此实现基于原始 Java 实现,以及一些来自网络上的资源。值得注意的是以下内容

有关更多实现细节,请参阅源代码。

安全考虑

原始实现中存在多个安全漏洞。特别值得注意的是使用 ECB 块模式,这是众所周知的不安全的。这种不安全的一个简单例子可以在 维基百科上的块加密模式文章 中找到。

这可能导致垃圾邮件发送者获取您的 site_secret。没有提供解决方案,安全令牌算法本质上是不可靠的

许可和版权

此代码的版权为 2015 年 Josh Leder。原始 Java 实现的版权为 2014 年 Google Inc。

此代码根据 Apache 2.0 许可证提供。