javascript - 在表单提交时,通过 php 文件获取 CSRF 并将值传递给请求

标签 javascript jquery forms

如果符合条件,我将奖励此问题 50 分。

我有一个投票系统,类似于 SO 上的投票方式。

当用户通过<form>投票时,我希望提交首先点击“get-csrf.php”来获取 CSRF key ,然后将该值传递给请求。

我怎样才能实现这个目标?

jQuery 代码:

jQuery('.votetopicform').submit(ajaxSubmit_votetopicform);

function ajaxSubmit_votetopicform(){

var votetopicform = jQuery(this).serialize();

jQuery.ajax({
    type:"POST",
    url: SiteParameters.site_url+"/wp-admin/admin-ajax.php",
    data: votetopicform,
    success:function(data){
        jQuery(".feedback").html(data); // empty div to show returned data
    }
});

return false;
}

get-csrf.php ,我有返回所需 key 的语句:

if (!isset($_SESSION['csrf'])) {
    $_SESSION['csrf'] = substr( md5(rand()), 0, 7);
}

return $_SESSION['csrf'];

因此,当用户单击“提交”时,我想通过 jQuery 代码获取 CSRF,然后将其发送到请求并在那里进行处理。

最佳答案

我建议您这样做的方法是在首先将表单交付给用户时将 token 放入隐藏的输入字段中。

<? if (!isset($_SESSION['csrf'])) { ?>
    <input type="hidden" name="csrf-token" value="<?= $_SESSION['csrf'] ?>">
<? } ?>

如果这对于您的情况来说不是一个可行的解决方案,您可以简单地链接请求。

jQuery('.votetopicform').submit(ajaxSubmit_requestcsrftoken);

function ajaxSubmit_requestcsrftoken(){
    jQuery.ajax({
        type:"POST",
        url: SiteParameters.site_url+"/get-csrf.php",
        success:function(data){
            ajaxSubmit_votetopicform(data);
        }
    });
}

您不必在提交表单时直接调用 ajaxSubmit_votetopicform,而是先调用一个请求 csrf-token 的函数。服务器将 token 返回给所述函数,该函数调用发送实际提交的函数并将返回的 token 作为参数传递给它。

在您的 ajaxSubmit_votetopicform - 函数中,您现在只需将返回的 token 添加到请求中提交的数据中。

$.serialize()返回一个 url 编码的字符串,您只需将其添加到字符串的末尾:

function ajaxSubmit_votetopicform(token){
   var votetopicform = jQuery(this).serialize();
   votetopicform += "&csrftoken=" + token; //token is passed as parameter to this fn

   ....
}

所以完整的 JavaScript - 代码将如下所示:

//set the submit - event handler to a function, that requests the token first
jQuery('.votetopicform').submit(ajaxSubmit_requestcsrftoken);

function ajaxSubmit_requestcsrftoken(){
    jQuery.ajax({
        type:"POST",
        url: SiteParameters.site_url+"/get-csrf.php",
        success:function(data){
            // after succesfully requesting the CSRF - token, call the function 
            // that should submit the actual form data to your server and pass the token as parameter to it
            // this way you are chaining one request after the other
            ajaxSubmit_votetopicform(data);
        }
    });

    return false; //prevent the form from submitting
}

function ajaxSubmit_votetopicform(token){

    var votetopicform = jQuery(this).serialize();

    //add the token as additional parameter to be sent to the server
    votetopicform += "&csrftoken=" + token;

    jQuery.ajax({
        type:"POST",
        url: SiteParameters.site_url+"/wp-admin/admin-ajax.php",
        data: votetopicform,
        success:function(data){
            jQuery(".feedback").html(data); // empty div to show returned data
        }
    });
}

关于javascript - 在表单提交时,通过 php 文件获取 CSRF 并将值传递给请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30307051/

相关文章:

javascript - 为什么我们将函数参数传递给 $scope.$apply

javascript - 使滚动条在移动浏览器中可见

jquery - jsonp 与 jquery

jquery - 使用 JavaScript 同时运行两个视频

javascript - 如何将表格行解析为 JS 函数 onClick 的参数?

css - 使用相同的 css 属性设置按钮和 anchor 标记不起作用

javascript - 使用 JavaScript 检查文件中的字符串

javascript - 使用javascript更改背景图片

javascript - 如何在主干 View 中创建内联编辑?

php - 表单不会将数据发送到mysql