我有一个CSRF预防的简单标记,它在不使用AJAX提交时按预期工作。但是当使用AJAX时,它会一直显示我创建的自定义错误。当使用AJAX提交表单时,CSRF令牌不起作用
这是我生成令牌功能:
function make_form_token() {
$token = base64_encode(openssl_random_pseudo_bytes(32));
$_SESSION['token'] = $token;
return $token;
} // end CSRF token generation
的功能,然后调用名为隐藏字段form_token
Send Enquiry
然后Ajax调用从PHP脚本接触提交。 PHP
$(document).ready(function(){
$("#send").click(function(){
$("#send").prop("disabled", true);
$(".hideloader").show();
$("#send").html("Sending ");
var form_data = $("#contact-form").serialize();
$.ajax({
type: 'POST',
url: 'contact-submit.php',
data: form_data
}).done(function(response) {
$("#server-results").hide().html(response).fadeIn("slow");
$("#send").prop("disabled", false);
$("#send").html("Send Enquiry");
});
});
});
接触submit.php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$message = "";
if (!isset($_SESSION['token']) || $_POST['form_token'] !== $_SESSION['token']) {
$message .= "There was an error submitting the form. Please try again later.
";
}
if ($message) {
echo "
" . $message . "
} else {
// send email etc.
}
}
2017-04-17
Jonathan
+0
你能的var_dump $ _ POST [ 'form_token']和$ _SESSION [ '令牌']?他们是一样的吗? –
+0
当尝试的var_dump我得到这个: 注意:未定义的变量:/应用程序/ MAMP/htdocs中/上线11 空字符串_SESSION(44) “HBFYoXNsHS9WsBc7vds/MukXr0CR8pBFPc7WGi3JPvY =” –
+1
是您的会议开始时,POST请求到达服务器? –