slushie / recaptcha-secure-token
生成与 ReCaptcha 兼容的安全令牌
1.1.1
2015-10-07 16:13 UTC
Requires
- php: >= 5.3.3
- ext-mcrypt: *
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_key
和 site_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 实现,以及一些来自网络上的资源。值得注意的是以下内容
- https://php.ac.cn/manual/en/mcrypt.ciphers.php
- http://tools.ietf.org/html/rfc5652#section-6.3
- http://www.networksorcery.com/enp/data/aes.htm
有关更多实现细节,请参阅源代码。
安全考虑
原始实现中存在多个安全漏洞。特别值得注意的是使用 ECB
块模式,这是众所周知的不安全的。这种不安全的一个简单例子可以在 维基百科上的块加密模式文章 中找到。
这可能导致垃圾邮件发送者获取您的 site_secret
。没有提供解决方案,安全令牌算法本质上是不可靠的。
许可和版权
此代码的版权为 2015 年 Josh Leder。原始 Java 实现的版权为 2014 年 Google Inc。
此代码根据 Apache 2.0 许可证提供。