反CSRF会话令牌脚本PHP逻辑问题

反CSRF会话令牌脚本PHP逻辑问题,php,security,webforms,Php,Security,Webforms,我觉得这是一个逻辑问题。在页面加载时,我调用token.php,它应该设置一个会话令牌,并用相同的令牌填充一个隐藏字段。 当我的webform提交时,它会在将信息发送给我之前比较令牌。其目的是防止CSRF攻击。因为我对PHP(以及js、jQuery、HTML、编码和许多其他东西)非常陌生,所以我找不到错误 我收到“令牌无效”响应。它应该为两个变量设置相同的令牌,我正在处理一个带有另一条错误消息的空白令牌 在my index.html的头部 <script> $(documen

我觉得这是一个逻辑问题。在页面加载时,我调用token.php,它应该设置一个会话令牌,并用相同的令牌填充一个隐藏字段。 当我的webform提交时,它会在将信息发送给我之前比较令牌。其目的是防止CSRF攻击。因为我对PHP(以及js、jQuery、HTML、编码和许多其他东西)非常陌生,所以我找不到错误

我收到“令牌无效”响应。它应该为两个变量设置相同的令牌,我正在处理一个带有另一条错误消息的空白令牌

在my index.html的头部

<script>
    $(document).ready(function() {
        $.get('token.php').done(function(data) {
            $('input[name="token"]').val(data);
        }).fail();
        {
        //failure code goes here
        }
    });
</script>

$(文档).ready(函数(){
$.get('token.php').done(函数(数据){
$('input[name=“token”]').val(数据);
}).fail();
{
//故障代码在这里
}
});
token.php

<?php
session_start();
    if (empty($_SESSION['token'])) {
        $_SESSION['token'] = bin2hex(random_bytes(32));
    }
    $token = $_SESSION['token'];
?>
<?php 
if($_SERVER["REQUEST_METHOD"] == "POST") {
    if (!empty($_POST['token'])) {
        if (hash_equals($_SESSION['token'], $_POST['token'])) {
            $emailbody = 'Name: '.$_POST['m_title'].' '.$_POST['m_firstname'].' '.$_POST['m_surname']."\n"
            .'Email: '.$_POST['m_email']."\n"
            .'Phone: '.$_POST['m_phone']."\n"
            .'D.O.B: '.$_POST['m_dob_day'].' '.$_POST['m_dob_month'].' '.$_POST['m_dob_year']."\n"          
            .'Postcode: '.$_POST['m_postcode']."\n"
            .'Lenders: '.$_POST['m_bank1'].','.$_POST['m_bank2'].','.$_POST['m_bank3'].','.$_POST['m_bank4'].','.$_POST['m_bank5'].','.$_POST['m_bank6'].','.$_POST['m_bank7'].','.$_POST['m_bank8'];               
            mail('**removed**', 'Web Lead', $emailbody);
            header('Location: **removed**.com/thankyou');
            exit();
        }   
        else {
            echo "token invalid";
        }
    }
    else {
        echo "token blank";
    }
}
else {
    echo "invalid request";
}
?>

formsubmit.php

<?php
session_start();
    if (empty($_SESSION['token'])) {
        $_SESSION['token'] = bin2hex(random_bytes(32));
    }
    $token = $_SESSION['token'];
?>
<?php 
if($_SERVER["REQUEST_METHOD"] == "POST") {
    if (!empty($_POST['token'])) {
        if (hash_equals($_SESSION['token'], $_POST['token'])) {
            $emailbody = 'Name: '.$_POST['m_title'].' '.$_POST['m_firstname'].' '.$_POST['m_surname']."\n"
            .'Email: '.$_POST['m_email']."\n"
            .'Phone: '.$_POST['m_phone']."\n"
            .'D.O.B: '.$_POST['m_dob_day'].' '.$_POST['m_dob_month'].' '.$_POST['m_dob_year']."\n"          
            .'Postcode: '.$_POST['m_postcode']."\n"
            .'Lenders: '.$_POST['m_bank1'].','.$_POST['m_bank2'].','.$_POST['m_bank3'].','.$_POST['m_bank4'].','.$_POST['m_bank5'].','.$_POST['m_bank6'].','.$_POST['m_bank7'].','.$_POST['m_bank8'];               
            mail('**removed**', 'Web Lead', $emailbody);
            header('Location: **removed**.com/thankyou');
            exit();
        }   
        else {
            echo "token invalid";
        }
    }
    else {
        echo "token blank";
    }
}
else {
    echo "invalid request";
}
?>

您没有从token.php返回任何信息

<?php

session_start();
if (empty($_SESSION['token']))
    $_SESSION['token'] = bin2hex(random_bytes(32));
echo ($_SESSION['token']);
要处理会话中存储的令牌,请不要忘记在formsubmit.php的开头添加:

<?php 
session_start();
if($_SERVER["REQUEST_METHOD"] == "POST") {
    //Your code
}

我有点迷路了。php标记和分号表示我理解的故障条件。我可以看到它使用echo生成会话令牌,但是如何将其复制到index.html上的隐藏令牌文件中?隐藏输入肯定有一个id,比如
我搞错了。做了一些修改后,我发现隐藏字段正确地存储了值,会话令牌到达formsubmit.php blank。我的问题必须是由于未正确存储会话令牌或导致其重置造成的。
var_dump($\u POST['token')
var_转储($_会话['token'])可能会有帮助哦,顺便说一句,不要忘记
session_start()
在formsubmit.phpDid中,是否确实创建了一个端点来设置令牌?有点达不到目的。。