php WordPress CSRF令牌生成不止一次

xurqigkl  于 12个月前  发布在  PHP
关注(0)|答案(1)|浏览(84)

我在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);

尝试使用不同的操作钩子,存储倒数第二个令牌以及最后一个令牌,使用计数器检查代码实际运行的次数。

mftmpeh8

mftmpeh81#

尝试在IF语句中使用did_action(),以避免多次触发该操作:

add_action('template_redirect', 'generate_csrf_token', 1);
function generate_csrf_token() {
    // Avoiding hook repetition
    if ( did_action( 'template_redirect' ) >= 2 )
        return;

    if ( is_page('myprofile') && session_status() === PHP_SESSION_NONE ){
        session_start();

        // Set the token in session, if it doesn't exist
        if ( ! isset($_SESSION['token']) ) {
            $_SESSION['token'] = md5(uniqid(mt_rand(), true));
        }
    }
}

应该能用
如果你想让会话在任何地方都保持活动状态(不仅仅是在“myprofile”页面中),请用途:

add_action('template_redirect', 'generate_csrf_token', 1);
function generate_csrf_token() {
    // Avoiding hook repetition
    if ( did_action( 'template_redirect' ) >= 2 )
        return;

    if ( session_status() === PHP_SESSION_NONE ){
        session_start();

        // Set the token in session, if it doesn't exist
        if ( is_page('myprofile') && ! isset($_SESSION['token']) ) {
            $_SESSION['token'] = md5(uniqid(mt_rand(), true));
        }
    }
}

相关问题