php csrf问题,一个请求生成一个csrf key token,但是界面用了两个POST?
高洛峰
高洛峰 2017-04-11 09:44:40
[PHP讨论组]

登录和注册放在一起了,但是一个请求只有一份csrf的key和token,这里会有两个POST,那这个怎么办呢?
我想到的是,分开或者一个成功后刷新页面

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(3)
伊谢尔伦

没关系的呀,审核的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_tokencookie或session里的csrf_token都是随页面成对随机生成的.

因为其他人猜不到你的$_COOKIE['csrf_token']$_SESSION['csrf_token'],所以能够防御请求伪造.

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号