0

背景

大家好,最近在看的关于抵御CSRF攻击的方法中,绝大多数都提及了加入token字段的方式。

但是这里有些疑问想请教一下,在查CSRF相关的文章中看到了这样一段话。

基于 Token 的身份验证方法

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

客户端使用用户名跟密码请求登录
服务端收到请求,去验证用户名与密码
验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

问题

1.上面这段话中,跨站伪造请求最开始窃取了目标网站的cookie发送了请求,那么如果我们将token放在了cookie中,不还是被窃取到了,到服务器的时候也是一样的拿到cookie中的token然后通过了认证么。
2.如果放在了页面表单中的hidden字段中,那攻击者是不是可以通过下载页面的源码找到隐藏字段并再次进行伪造请求呢。
3.token的本质还是在客户端加入了验证的信息,并且登录之后存在一段时间而不是一次一个,那么通过抓包的方式是不是也能窃取到token呢。

望赐教,谢谢!

vipwhr 1.3k
2017-07-26 提问
1 个回答
3

已采纳
  1. CSRF拿不到cookie,能拿到Cookie的是XSS不是CSRF。
  2. 每个用户的token都不一样,攻击者下载页面得到的token在被攻击者那边无效,通不过校验。同上,CSRF也拿不到被攻击者的页面内容。
  3. 抓包是另外一个安全问题了,要通过HTTPS解决,还是跟CSRF无关。

以下回复题主的评论:

  1. 提交表单时,token一般会作为表单的一个隐藏域被提交,类似<input type='hidden' name='token' value='xxxxxx'>,提交到服务器之后,服务器再校验表单提交的token和cookie中的token是否一致,一致则校验通过,不一致则很可能是CSRF攻击者的伪造请求。CSRF的确可以把Cookie提交到服务器,但是伪造不了表单的token,因为他拿不到Cookie的内容,那就通过不了校验。
  2. 别人浏览器中的页面你还能下载到?Ajax都是被浏览器禁止跨域的,浏览器怎么可能让你下载到别人打开的页面。现代的浏览器都是很安全的。
  3. ~。

撰写答案

推广链接