簡體   English   中英

使用Ajax提交表單時,CSRF令牌不起作用

[英]CSRF token not working when submitting form with ajax

我有一個用於CSRF預防的簡單令牌,當不使用AJAX提交時,它可以按預期工作。 但是當使用AJAX時,它會繼續顯示我創建的自定義錯誤。

這是我生成令牌的功能:

function make_form_token() {
    $token = base64_encode(openssl_random_pseudo_bytes(32));
    $_SESSION['token'] = $token;
    return $token;
} // end CSRF token generation

然后在名為form_token的隱藏字段中調用該函數

<form id="contact-form" method="post">
    <input type="hidden" name="form_token" value="<?php echo make_form_token(); ?>">

    <div class="col-sm-5 col-md-4 col-xs-6">
        <button id="send" type="submit" name="submit" class="btn btn--primary type--uppercase">Send Enquiry</button>
    </div>
</form>

然后,ajax從contact-submit.php調用php腳本。

$(document).ready(function(){
    $( "#send" ).click(function(){
        $( "#send" ).prop( "disabled", true );
        $( ".hideloader" ).show();
        $( "#send" ).html( "Sending <img src='img/ajax-loader.gif'>" );

        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. <br/>";
    }

    if ($message) {
        echo "<div class='red-error'><b>There were errors in your form:</b> <br/>" . $message . "</div>";
    } else {    
        // send email etc. 
    }
}

我想我知道你的問題是什么。 讓我知道我是否錯。 您有以下HTML:

<form id="contact-form" method="post">
<input type="hidden" name="form_token" value="<?php echo make_form_token(); ?>">
<div class="col-sm-5 col-md-4 col-xs-6">
<button id="send" type="submit" name="submit" class="btn btn--primary type--uppercase">Send Enquiry</button>
</div>
</form>

在頁面加載時會生成此HTML,但我認為這也是在POST上生成的,因此,當您將form連同有效的form_token一起form_token並且請求到達服務器時,它會生成一個新的令牌(生成HTML時),將其存儲到$ _SESSION中,這將與它在頁面加載時生成的內容不同。 解決方案是僅在您的請求為GET時生成form

編輯:確保在POST請求到達服務器時啟動會話。

EDIT2:這是您可以檢查您的請求是否為POST的方法:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
     // The request is using the POST method
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM