Php 发送表单时随机令牌与会话不匹配

Php 发送表单时随机令牌与会话不匹配,php,forms,oop,session,Php,Forms,Oop,Session,我正在建立一个登录表单,我正试图使其尽可能可被黑客攻击,我使用了一个3击规则,当输入错误3次时,将暂停登录3分钟,以防止暴力进入,并使用sha256,据我所知,它使用随机盐和胡椒技术,至今无法被黑客攻击 然后将密码随机拆分并重新组合 无论如何,够了: 我构建了一个表单,该表单发送一个隐藏表单字段,其中包含随机会话令牌,该令牌在每次生成表单时都会更改,如果该令牌与用户浏览器上的当前会话不匹配,则会拒绝该表单 问题是,由于某种原因,在发送表单时,表单不匹配,即使它应该匹配 我不知道为什么 这是我的密

我正在建立一个登录表单,我正试图使其尽可能可被黑客攻击,我使用了一个3击规则,当输入错误3次时,将暂停登录3分钟,以防止暴力进入,并使用sha256,据我所知,它使用随机盐和胡椒技术,至今无法被黑客攻击

然后将密码随机拆分并重新组合

无论如何,够了:

我构建了一个表单,该表单发送一个隐藏表单字段,其中包含随机会话令牌,该令牌在每次生成表单时都会更改,如果该令牌与用户浏览器上的当前会话不匹配,则会拒绝该表单

问题是,由于某种原因,在发送表单时,表单不匹配,即使它应该匹配

我不知道为什么

这是我的密码:

创建会话:

$formsession = $session->setSessions('RANDOM_FORM_SESSION,' . $general->randomString());
从课时开始,我做了:

public function setSessions($key = ''){

    if(is_array($key)){

        foreach($key as $k){

            list($sessionname, $result) = explode(',', $k);
            $_SESSION[$sessionname] = $result;

        }

    } else {

        list($sessionname, $result) = explode(',', $key);
        $_SESSION[$sessionname] = $result;

    }

}
从我创建的表单类:

public function createHiddenPosts($value, $name, $id = ''){

    if(!empty($id)){ $id = 'id="'.$id.'" '; }

    return '<input type="hidden" value="'.$value.'" '.$id.'name="'.$name.'">';

}
最后,检查会话是否等于令牌的代码:

if(!$errors){ if(isset($_POST['formissent']) && $_POST['formissent'] == $_SESSION['RANDOM_FORM_SESSION']){ $form = true; } else { $errors[] = 'Our site only accepts forms submitted from our website and only from users who accept cookies!'; } }

对于我的生活,我不明白为什么它不匹配。任何提示都将不胜感激:

因为您正在检查post之前更改会话。只需移动$formsession=$session->set。。。。在IFAsset$\u POST之后[..@bansi这是否意味着在发送表单之前页面实际上会刷新?@bansi通过设置表单提交时的会话将意味着不会生成令牌,这将返回失败。我可能是错的,但据我所知,您正在创建一个带有隐藏FormsSent的表单,到目前为止还不错。当您提交表单时代码点击$formsession=$session->set…,这个新值被存储到$\u session['RANDOM\u FORM\u session']中。然后在代码中稍后比较$\u POST['formsession']==$\u session['RANDOM\u FORM\u session']时,它将不匹配,因为$\u session['RANDOM\u FORM\u\u session']已用新值更改。只能用更多代码确认。@谢谢,您是正确的。我在发送表单后设置会话检查,请将此作为答案,我将接受:
if(!$errors){ if(isset($_POST['formissent']) && $_POST['formissent'] == $_SESSION['RANDOM_FORM_SESSION']){ $form = true; } else { $errors[] = 'Our site only accepts forms submitted from our website and only from users who accept cookies!'; } }