我一直在讨论这里关于 nonce 生成和 PHP 的各种问题,但没有找到任何关于管理 nonce 的“一次”方面的细节的讨论。
这是我的情况。
我有一些 PHP 需要访问网络服务,而对网络服务的请求要求我的 PHP 生成随机数并签署请求(即,我不是从网络服务请求随机数)。这部分很简单。
我正在努力寻找一个好的解决方案,以防止在可能有多个 session 进行时重复使用 nonce。
在我看来,我可以做三件事。
一个是在数据库中存储随机数/时间戳对,然后实现检查数据库中现有随机数、使旧随机数过期等的逻辑。这也需要一个 TRANSACTION 或LOCK 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/
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想用这两种语言中的任何一种(最好是ruby)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生
这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什
我想在ruby中生成一个64位整数。我知道在Java中你有很多渴望,但我不确定你会如何在Ruby中做到这一点。另外,64位数字中有多少个字符?这是我正在谈论的示例......123456789999。@num=Random.rand(9000)+Random.rand(9000)+Random.rand(9000)但我认为这是非常低效的,必须有一种更简单、更简洁的方法来做到这一点。谢谢! 最佳答案 rand可以将范围作为参数:pa=rand(2**32..2**64-1)#=>11093913376345012184putsa.
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:HowdoIgeneratealistofnuniquerandomnumbersinRuby?我想做的事:Random.rand(0..10).timesdoputsRandom.rand(0..10)end但如果随机数已经显示过,则无法再次显示。如何最轻松地做到这一点?