js获取cookie中的token作为表单中的token是否安全?

xiermail0
  • 158

为了防止csrf攻击,通常除了在cookie设置token,一般还要在表单上有一个隐藏的token。而这两个一般是由服务器传过来的,那如果这个表单上的token直接用js获取cookie上token作为其值是否安全?

// HTML 有一个隐藏域token
<input id="token" type="hidden" name="token" value="" />
// JavaScript(jQuery) js将cookie中token作为隐藏域token的值
var cookie_token = $.cookie('token');
$('#token').val(cookie_token);
// 请求时带上这个隐藏域token和cookie中的token,这样做Web是否可能遭受csrf攻击,或者其它什么安全风险?
回复
阅读 2.6k
3 个回答
  1. cookie 会自动上传
  2. 表单里的 <input type="hidden"> 也会自动上传
  3. 既然都自动上传了,你再用 js 上传还有意义么?
  4. 最大的不安全就是开发人员根本不懂危险从哪里来,瞎看瞎整

然后说下 CSRF。

  1. CSRF = A 网站的用户被欺骗,在 B 网站提交表单到 A 网站,进行非预期的操作
  2. CSRF 的要点:

    1. 在 A 站外构建攻击
    2. 用户保留着 A 站的身份认证(多数是 cookie)
  3. 防御 CSRF 的方式:

    1. 从 B 站发起的请求无法使用 A 站的身份认证,也就是 cookie 里的 sameSite
    2. A 站不只以单一条件验证用户身份。这个方案就很多了,你问题里的表单里暗藏 csrf_token 是其中之一,SPA 里也可以在登录后单独请求一次 token,然后放 header
  4. 所以你的方案很明显不行

最后说下建议。

不要问这样行不行,那样行不行。搞清楚原理,搞清楚方案的逻辑,选择合适的、可靠的方案。

没有绝对的安全

不安全。

  1. 利用token方式防御CSRF的关键在于:在请求中放入攻击者所不能伪造的信息,并且该信息不存在于Cookie之中。

假设(只是假设)把token放入cookie里也最好设置下sameSite属性。

  1. 服务端可以考虑把token塞入response header,或者直接喷到页面里作为全局变量,看你在客户端怎么方便提取了。
宣传栏