我一直在讨论关于 nonce 生成和 PHP 的各种问题,但没有找到任何关于管理 nonce 的“once”方面的细节的讨论。
这是我的情况。
我有一些 PHP 需要访问 Web 服务,而对 Web 服务的请求需要我的 PHP 生成一个随机数并对请求进行签名(即,我不是从 Web 服务请求随机数)。那部分很容易。
当可能有多个会话正在进行时,我正在努力寻找一个好的解决方案来防止重复使用随机数。
在我看来,我可以做三件事。
一种是在数据库中存储随机数/时间戳对,然后实现逻辑来检查数据库是否存在现有随机数、过期旧随机数等。这也需要一个TRANSACTION
orLOCK TABLE
线程安全。呸。
二是把nonce存入APC的store中(我的情况下不能使用memcached),让TTL处理过期。在这种情况下,线程安全需要将逻辑包装在sem_acquire()
/中sem_release()
还是apc_add()
真正的线程安全?我对此的主要关注是如果缓存已满apc_add()
或实际上失败了如何处理这种情况。apc_store()
三、是用Cache_Lite代替APC。
还有其他选择吗?据我所知,OpenID 使用 Cache_Lite 管理随机数,所以我怀疑这是最好的解决方案,但我想在提交之前检查所有选项。
谢谢。