通过jquery读cookie添加xsrf HTTP头来避免请求伪造

问题前因

如果用户已经登录了我们的a.com网站,用户又打开了一个恶意网站 evil.com,那么evil.com可以向a.com发送http请求,比如发送ajax,并且在发送时,可以通过设置ajax的属性,让这个请求带上a.com的cookie。
这样的话问题就来了,这个请求被a.com网站看来是合法的,并进行处理,但这个请求可能是伪造的并不是用户的本意

如何破?

方法一:

对每一个http请求都加一个“隐藏”参数,服务器处理请求时,校验这个参数。这个方法要求我们开发人员都要改代码,给每一个请求(比如表单提交)填一个隐藏参数,耗人力。

方法二:

用户登录时,给用户session中生成一个随机数,并把这个随机数写到浏览器的cookie中,

req.session.xsrfToken = req.session.xsrfToken || secret.getRandomToken();
res.cookie("XSRF-TOKEN", req.session.xsrfToken, { path: '/' });

以后的所有jquery ajax请求中,利用如下代码填上一个X-XSRF-TOKEN头:

//全局配置jquery ajax请求填上防止跨域请求伪造的http头X-XSRF-TOKEN
if (window.$ && window.$.ajaxSetup) {
   $.ajaxSetup({
        beforeSend: function (xhr) {
        var match = window.document.cookie.match(/(?:^|\s|;)XSRF-TOKEN\s*=\s*([^;]+)(?:;|$)/);
        xhr.setRequestHeader("X-XSRF-TOKEN", match && match[1]);
        }
        });
}

服务器收到请求后,统一检查此http头和用户session的随机数是否一致

我们node服务器的检查代码如下:

if (req.session.xsrfToken && req.session.xsrfToken !== req.headers['x-xsrf-token']) {
            res.send(403, 'no x-xsrf-token'); //以后去掉这个错误提示
            return;
        }

effevo技术团队出品 (https://effevo.com)
通过jquery读cookie添加xsrf HTTP头来避免请求伪造_第1张图片

你可能感兴趣的:(网站架构)