第 28 题:cookie 和 token 都存放在 header 中,为什么不会劫持 token?
cookie:服务员看你的身份证,给你一个编号,以后,进行任何操作,都出示编号后服务员去看查你是谁。
token:直接给服务员看自己身份证
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
cookie:服务员看你的身份证,给你一个编号,以后,进行任何操作,都出示编号后服务员去看查你是谁。
token:直接给服务员看自己身份证
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(19)
这个 SameSite=strict 就可以对付了。
而浏览器,会自动带上请求同域的cookie。(AJAX 不会自动携带cookie)
应该是同站,而不是同域是倒是这个理,不过你这个说的也太简陋了,
补充点:服务员给你的编号是状态化的,这个信息是会过期的,但是token使用的身份证号码是持久化的
存在客户端的信息都是不安全。入侵者key轻松获取到token,在他的钓鱼网站也是很轻易的将偷来的token放在接口的header里的
token
为什么要放到 header 里面,作为URL
参数传过去不也可以吗?请求时token不会被自动带上,cookie会被自动带上;但是如果token存储在cookie里也会被劫持的啊。token只是身份认证是否合法,都放header里除非https防报文拦截,也只能做到传输的安全。
看了大家的回答,又去查了一下,写一下自己的理解,如果哪里不对,还请大家指正~ 谢谢~
cookie
cookie可以存一些用户信息。因为 HTTP 是无状态的,它不知道你有没有登陆过。故可以通过cookie里的信息解决无状态的问题。
而浏览器,会自动带上请求同域的cookie。(AJAX 不会自动携带cookie)
token
后端把用户信息和其他内容放进去,通过 jwt 生成 token,返回给前端。
浏览器是不会自动携带 token。
CSRF 跨站点请求伪造
通过浏览器会自动携带同域cookie的特点。cookie的传递流程是用户在访问站点时,服务器端生成cookie,发送给浏览器端储存,当下次再访问时浏览器会将该网站的cookie发回给服务器端
由于HTTP是无状态的,A网站不知道这个请求其实是恶意网站B发出的,就会根据cookie来处理请求,从而执行了攻击代码。
而浏览器不会自动携带 token,所以不会劫持 token。
XSS
就是说,cookie和token都可能被拿到,所以都废了。
自我观点,不对请指出!!!谢谢~~
token为什么不能被劫持呢????前提是你是jwt的话,一般 都是放入sessionStorage中的,为什么不可以劫持呢?cookie还存在http only,Storage并不存在.所以我认为,jwt只是针对请求的安全性,并不在意你的token的安全.毕竟token的安全,那是后端属于jwt的加密算法,有效性验证了.后端要保证jwt的有效时限限制,刷新策略,比较策略等.那你要是说,不是我前端发的都要被过滤,那你总不能还不让人模拟请求吧???那你真要有这种需求,那你就加个白名单等的策略呗.
那再回到题目上:cookie 和 token 都存放在 header 中,为什么不会劫持token?
首先,cookie的劫持只是不在http only下,js篡改或其他脚本非法获取,还有就是cookie会被浏览器每次请求都会携带在header中,这也就是csrf攻击的来源.然而,传统的b/s web开发,都是用session 来做状态标识,而session id都会默认存在cookie中,浏览器每次都会携带cookie.
XSS跨站脚本攻击 利用的是用户对指定网站的信任,CSRF跨站请求伪造 利用的是网站对用户浏览器的信任。当用户(被攻击者)登录网站时就会执行这些恶意代码,通过这些脚本可以读取cookie,session tokens。所以对于XSS而言,token也没用。
所以这个问题应该是对于跨站请求伪造CSRF而言的。
是csrf哦
“token:登陆后后端不返回一个token给客户端”,多了个“不”字?
服务端下发token,客户端需要存储本地,在需要token的请求中带上发给后端.
储存策略设计不当,攻击者还是可以写脚本(XSS)获取token,进而进行CSRF攻击.
分享一篇文章,讲如何防止CSRF攻击。
https://tech.meituan.com/2018/10/11/fe-security-csrf.html
1、token防止为了防止CSRF,防止频繁请求一种手段,验证码当然也可以;
2、CSRF攻击利用浏览器会自动带上会话信息劫持,token属于安全上流程判断;
题目可能有点问题,在劫持面前,不管cookie还有token,都能劫持。
只是说: cookie会自动携带上,而token需要设置header才可。
具体说一下xss层面的劫持和csxf层面的劫持:
xss: 劫持cookie或者localStorage,从而伪造用户身份相关信息。前端层面token会存在哪儿?不外乎cookie localStorage sessionStorage,这些东西都是通过js代码获取到的。解决方案:过滤标签<>,不信任用户输入, 对用户身份等cookie层面的信息进行http-only处理。
csxf:是后端过于乐观的将header区的cookie取到(所以这才是主要原因,不是因为会自动携带cookie所以不安全,是后端代码不安全而已),并当作用户信息进行相关操作。解决方案也很简单,对于cookie不信任,对每次请求都进行身份验证,比如token的处理。
所以说,不管cookie token都能劫持,对开发者而言,做好这两种攻击即可。
上面的两种攻击方式,如果被xss攻击了,不管是token还是cookie,都能被拿到,所以对于xss攻击来说,cookie和token没有什么区别。但是对于csrf来说就有区别了。
以上面的csrf攻击为例:
这是个人理解的为什么只劫持cookie不劫持token的原因。
我可以把token放在body中啊.
我也可以不用token这个关键字.
主要还是cookie会被浏览器自动带上, 劫持了才容易攻击.
1、首先token不是防止XSS的,而是为了防止CSRF的;
2、CSRF攻击的原因是浏览器会自动带上cookie,而浏览器不会自动带上token
--该题终结--
原问题是 #32 (在本问题的语境下,token 默认存储在js自定义http head上)
用问题一
来说明token比cookie安全并不成立。
都成功的xss了,我拿cookie干嘛,我直接插入脚本,都能直接在用户浏览器里面发ajax请求了(token也要存在页面上),管他token,cookie,都得完蛋。
但是问题二是成立的,对比token,cookie不安全的地方在于会被浏览器自动带上,所以crsf攻击才管用。
所以问题并不成立,在xss攻击面前,token 和 cookie 都凉了。