簡體   English   中英

在Phalcon中將CSRF保護服務與Ajax一起使用

[英]Using CSRF Protection Service with Ajax in Phalcon

我在使用Ajax的Phalcon中使用CSRF保護組件時遇到麻煩。

html表格

<form id="signup-form" onSubmit="onSignUpSubmit(); return false;">
    <input id="username" type="text" placeholder="Username" />
    <input id="password" type="password" placeholder="Password" />
    <input id="email" type="text" placeholder="Email" />
    <input id="signup-csrf-token" name="{{ security.getTokenKey() }}" val="{{ security.getToken() }}" type="hidden" />
    <button class="btn btn-primary btn-block" type="submit">Sign Up</button>
</form> <!-- #signup-form -->

Ajax代碼

var username    = $('#username', '#signup-form').val(),
    password    = $('#password', '#signup-form').val(),
    email       = $('#email', '#signup-form').val(),
    csrfKey     = $('#signup-csrf-token').attr('name'),
    csrfValue   = $('#signup-csrf-token').attr('val');

    var postData = {
        'username': username,
        'password': password,
        'email': email
    };
    postData[csrfKey] = csrfValue;

    $.ajax({
        type: 'POST',
        url: '{{ url('/accounts/signup.action') }}',
        data: postData,
        dataType: 'JSON',
        success: function(result){
            console.log(result);
        }
    });

首次發送Ajax請求時,Controller中的$this->security->checkToken()函數返回true。 但是在第二次及以后,該函數返回false。

我認為每個HTTP請求的csrfToken更改都會導致此問題。 但是如何解決呢?

誰能幫我?

您將需要在AJAX成功響應中返回新的CSRF令牌。 然后使用新令牌更新您的表單字段。

賬戶/ signup.action

return json_encode((object) array(
    'output' => $original_output,
    'csrf' => (object) array('name' => $csrf_name, 'value' => $csrf_token)
));

使用Javascript

$.ajax({
    type: 'POST',
    url: '{{ url('/accounts/signup.action') }}',
    data: postData,
    dataType: 'JSON',
    success: function(result){
        $('input#signup-csrf-token')
            .attr('name', result.csrf.name)
            .val(result.csrf.value);
        console.log(result.output);
    }
});

你也應該改變

$('#signup-csrf-token').attr('val');

$('#signup-csrf-token').val();

暫無
暫無

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

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