通过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
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
客户端支持防止CSRF/XSRF(跨站请求伪造)的方法主要包括以下几种: 1. 验证码:在敏感操作如支付、修改密码等环节,向用户发送验证码,要求用户输入正确的验证码后才允许进行操作。这样可以有效防止CSRF攻击,因为攻击者无法获取有效的验证码。 2. Token验证:在用户登录时生成一个随机的Token,并将其储存在Session或Cookie中,每次向服务器发起请求时都需要将该Token一同发送。服务器接收到请求后会校验Token的合法性,如果无效则拒绝该请求。这可以防止CSRF攻击者盗用用户身份发起恶意请求。 3. Referer检查:在HTTP头部中会包含Referer字段,用于表示请求来源。服务器可以根据Referer字段的值判断请求是否来自合法来源,如果不是则拒绝请求。但需要注意的是,Referer字段不是必须的,而且可能被篡改,因此这种方法并不是绝对可靠。 4. SameSite Cookie属性:使用SameSite属性可以限制Cookie的发送,使其只在同一站点下请求时才会被发送。这样可以防止跨域请求Cookie的被盗用。但需要注意的是,SameSite属性支持程度不同浏览器有所差异,不同浏览器可能需要额外的配置或使用其他方法来提供更好的保护。 总体而言,以上几种方法并非绝对安全,各自有一定的局限性。因此,最好的防范方法是综合使用多种防护措施,加强客户端和服务端的安全防护。此外,开发人员还应持续关注最新的安全技术和漏洞情报,及时更新和修复系统,确保用户数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值