gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:13:40 25 4
gpt4 key购买 nike

如果符合条件,我将奖励此问题 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com