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