php - 在 Apache/PHP 中管理随机数

标签 php apache nonce

我一直在讨论这里关于 nonce 生成和 PHP 的各种问题,但没有找到任何关于管理 nonce 的“一次”方面的细节的讨论。

这是我的情况。

我有一些 PHP 需要访问网络服务,而对网络服务的请求要求我的 PHP 生成随机数并签署请求(即,我不是从网络服务请求随机数)。这部分很简单。

我正在努力寻找一个好的解决方案,以防止在可能有多个 session 进行时重复使用 nonce。

在我看来,我可以做三件事。

一个是在数据库中存储随机数/时间戳对,然后实现检查数据库中现有随机数、使旧随机数过期等的逻辑。这也需要一个 TRANSACTIONLOCK TABLE 用于线程安全。呸。

二是将随机数存储在 APC 中(在我的情况下不能使用 memcached),并让 TTL 处理过期。在这种情况下,线程安全是否需要将逻辑包装在 sem_acquire()/sem_release() 中,或者 apc_add() 是否真正线程安全?我主要关心的是如果 apc_add()apc_store() 由于缓存已满而实际失败时如何处理这种情况。

三,是用Cache_Lite代替APC。

还有其他选择吗?据我所知,OpenID 使用 Cache_Lite 管理随机数,所以我怀疑这是最好的解决方案,但我想在提交之前检查所有选项。

谢谢。

最佳答案

One, is to store nonce/timestamp pairs in the database, and then implement the logic to check the database for an existing nonce, expire old ones, etc. This would also require a TRANSACTION or LOCK TABLE for thread safety. Yuck.

您可以在不锁定表的情况下执行此操作。只要您使用的数据存储是 ACID compliant ,它将为您完成所有艰苦的工作。这意味着如果您使用的是 MySQL,则使用 InnoDB 表。

创建一个表,其中包含随机数、创建时间、最长生命周期和使用时间的字段。使 nonce 成为主键或唯一键。要分配随机数,请插入表中。如果您遇到重复键错误(或使用事务并遇到死锁或类似问题),请捕获它并生成一个新的随机数。

如果您使用 an adequate randomness generator like openssl_random_pseudo_bytes并且正在为 nonce 收集足够的字节,开始时发生冲突的可能性非常小。

当您需要将随机数标记为已消耗时,对随机数行执行简单的更新还要求已消耗的列为空。更新将返回修改的行数(如果您正在使用事务,则返回死锁)。如果修改后的行计数为零或者您遇到了死锁,那么其他东西已经将 nonce 标记为已使用,您可以向用户返回适当的错误。

请记住,正确的数据库引擎设计是为了处理这种无意义的事情。不要重新发明轮子。

关于php - 在 Apache/PHP 中管理随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5248416/

相关文章:

java - tomcat中奇怪的IP地址

ajax - Wordpress nonce 检查总是错误的

php - flickr oauth api 随机返回签名无效错误

php - Codeigniter 强制所有流量发送至特定 Controller 和方法

PHP扩展困惑

php - Laravel 4 中的用户身份验证

php - 通过 PHP 连接到数据库不起作用

Apache 使用隐式重定向重写

php - 网站文字大小限制

java - Tomcat 8.5 反 CSRF 随机数未生成