我在WordPress上运行一个网站,我想实现CSRF保护,我主要在网站上使用PHP,并在短代码和子主题的帮助下,我尝试在短代码中实现令牌生成,并在大多数代码运行之前使用动作钩子运行,以便令牌可以存储在会话中并在另一个页面上使用,并且它总是运行不止一次(两次)。我发现了另一个问题,人们描述了这可能是因为其他“进程”也在运行页面,他们在页面上运行代码,这会改变显示的值。当我将令牌填充到表单中时,提交,它总是一个令牌不匹配,因为这个,我可以在之前存储令牌并使用它来检查匹配,但这不是问题的真实的解决方案,如果页面运行两次以上,它又是一个不匹配。
我如何确保我的代码每次访问只运行一次?
我在function.php文件中的代码
function generate_csrf_token() {
if(is_page('myprofile')){
session_start();
$token = md5(uniqid(mt_rand(), true));
$_SESSION['token'] = $token;
}
}
add_action('template_redirect', 'generate_csrf_token', 1);
尝试使用不同的操作钩子,存储倒数第二个令牌以及最后一个令牌,使用计数器检查代码实际运行的次数。
1条答案
按热度按时间mftmpeh81#
尝试在
IF
语句中使用did_action()
,以避免多次触发该操作:应该能用
如果你想让会话在任何地方都保持活动状态(不仅仅是在“myprofile”页面中),请用途: