登录和注册放在一起了,但是一个请求只有一份csrf的key和token,这里会有两个POST,那这个怎么办呢?
我想到的是,分开或者一个成功后刷新页面
没关系的呀,审核的csrf_token 都是session给的,我懂了,您的
csrf_token
是 放表单里的对吧,您可以放在
meta
标签里呀,通过
ajax
提交表单。或者甩在
form
外面每次异步提交就无所谓了,渲染视图的时候放在
meta
标签里或者丢出去,异步提交的时候抓回来丢到后端就可以了
$.request('post','/reg',{});
$.extend({
/**
* $.ajax请求的封装
*
* @usage return $.request("post", url, {}).done(function(responce) {}).fail(function() {});
* @usage return $.request("post", url, null).then(function(responce) {});
*
* @param {[type]} method [POST/GET]
* @param {[type]} url [请求URL]
* @param {[type]} data [传递的数据]
* @param {[type]} userOpts [自定义参数: {headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')}}]
*
* @return {[type]} [description]
*/
request: function(method, url, data, userOpts) {
var defer, options;
defer = $.Deferred();
options = $.extend({
method: method,
url: url,
dataType: "json",
async: false,
data: data,
timeout: 3000,
cache: false,
headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') ? $('meta[name="csrf-token"]').attr('content') : ''},
beforeSend: function(msg) {
// 发送前的调试
}
}, userOpts);
$.ajax(options).done(function(data, textStatus, jqXHR) {
//return defer[(data.error ? "reject" : "resolve")](data);
return defer[(data.error ? "reject" : "resolve")](eval(data));
}).fail(function(jqXHR) {
window._hmt && window._hmt.push(['_trackEvent', 'AJAX_REQUEST_ERROR', 'error']);
return defer.reject();
});
return defer.promise();
}
});
后者靠谱。。。
这两个表单各自的隐藏域可以使用同一个csrf_token.
提交表单操作后,服务器端拿
$_POST['csrf_token']
跟
$_COOKIE['csrf_token']
或
$_SESSION['csrf_token']
比对,一致则是合法提交.
表单隐藏域里的csrf_token
和
cookie或session里的csrf_token
都是随页面成对随机生成的.
因为其他人猜不到你的
$_COOKIE['csrf_token']
或
$_SESSION['csrf_token']
,所以能够防御请求伪造.