如果我冒用 token 用 postman 发送一个请求 不是一样可以成功吗? 但是实际上我测试了一个网站是不可以的. 这个网站还很有趣的返回了成功的提示消息
1
zzNucker 2020-03-18 14:27:47 +08:00
你都能冒用 token 了 说明你已经能够完整控制一个网站的前端了
这种情况下需要防御的不是 csrf 了 是 xss |
2
b821025551b 2020-03-18 14:28:40 +08:00 1
请好好理解一下什么是 csrf
|
3
littleylv 2020-03-18 14:30:24 +08:00 1
请好好理解一下什么是 csrf +1
|
4
yaphets666 OP |
5
yaphets666 OP @zzNucker 可能我理解的冒用 token 理解有误,token 不是很好获取吗?
|
6
lhx2008 2020-03-18 14:49:02 +08:00
我理解 CSRF 通常是一步操作,比如说一个提交。但是加了 token 之后, 变成了两步(获取 Token + 发送 Token ),而在第三方网站要同时做到读取和发送是不太可能的。
|
7
chinafeng 2020-03-18 14:49:06 +08:00
@yaphets666 #4 去看一下 CSRF 原理,比如你现在在 V2EX,我通过脚本等方式直接在后台发了个帖子,你想想 Token 的作用
|
8
chinafeng 2020-03-18 14:50:23 +08:00
每次请求时 CSRF Token 都是不同的,你除非能控制前端,否则如何成功呢?
|
9
murmur 2020-03-18 14:52:08 +08:00 1
csrf 解决的是冒用 cookies 层面的问题
|
10
liuxey 2020-03-18 14:52:59 +08:00
“如果我冒用 token” 这几字就表示和 CSRF 已经没关系了
CSRF 中文名字叫:跨站请求伪造,你都能拿到 token 了,就不需要伪造,直接爆破 最近 web 基础差的人不少啊 |
11
yaphets666 OP @chinafeng 意思是 csrf 这个 token 和用来登录的 token 还不是一个东西? csrf 这个 token 是每发送一个新的请求,就在前端生成一个 token,后端验证?
|
12
yaphets666 OP @liuxey 我的意思是获取到用于登录的 token 这个 token 不是固定的吗?
|
13
chinafeng 2020-03-18 15:02:48 +08:00
@yaphets666 #11 你指的登录的 Token 是什么东西? CSRF Token 的话,你目前正在看的这个帖子就有,View Page Source 看看吧,多刷新几次页面
|
14
q8164305 2020-03-18 15:05:14 +08:00 via Android
csrf 主要防钓鱼网站的
|
15
yaphets666 OP @chinafeng 登录 token 就是用于保持登录状态的 token,是这样的,我从 github 上找到一个开源项目叫 renrenfast,前端代码是每次请求都携带登录成功时后端返回的 token 用于保持登录状态. 而 CSRF Token 是每次请求都新生成一个,次次不同,我理解的对吗?
|
16
ooh 2020-03-18 15:09:58 +08:00
你获取我的 Token 康康
|
17
yaphets666 OP @ooh 场景是这样的...我自己"偷"我自己的 token 我从浏览器直接复制过来
|
18
Telegram 2020-03-18 15:17:36 +08:00 1
给你大概讲一下 csrf 的例子:
比如有个网站,点赞是 get 方式请求: http://www.xxxx.com/like?id=12365 如果没有验证 token 的话,我只要随便在某个网页发个图,图片地址设置这个 url,对方只要访问这个页面,加载这个图,对方就会自动给 id 为 12365 的帖子点赞了。 如果验证 token,点赞的 get 的可能就是这种: http://www.xxxx.com/like?id=12365&token=A23F267AE65,由于每个人的 token 是变化的,你无法预先知道对方的 token,对方加载了 http://www.xxxx.com/like?id=12365,也不会成功 |
19
chinafeng 2020-03-18 15:18:08 +08:00
@yaphets666 #15 这两个 Token 不是一个东西,前者应该是程序自定义的一个令牌,CSRF 是一套规范
|
20
CloudMx 2020-03-18 15:20:14 +08:00
这里的 Token 是 Anti csrf Token,核心点就是随机值(时效性在这里相对随机特性弱很多),你是怎么猜,怎么算都算不出来的一个值,除非你借助了其他安全问题来获取这个值,而且这个值还没失效。
|
21
CloudMx 2020-03-18 15:23:12 +08:00
@CloudMx 我把大家常说的这个 Token 设置为纯数字也是一样的道理,不在意是什么值,只在意在使用一次或者短时间内使用范围,你猜不出来。
|
22
b821025551b 2020-03-18 15:27:51 +08:00 1
从你的各种回复来看还是没理解什么是 csrf。
首先,有 csrf 的前提是有个有效的 cookie,攻击者通过伪造 url 并诱导被攻击者去点击。 整个过程攻击者不需要获取到被攻击者的 cookie。 防范 csrf 的 token 原理就是验证这次请求的 url 是否是官方下发的,攻击者伪造的 url 伪造不出来正确的 token。 另外,你说的那种鉴权 token 等同于 cookie,但是没有 token 就没有 csrf,获取到你说的那个鉴权 token/cookie,不属于 csrf 范畴。 |
23
murmur 2020-03-18 15:29:29 +08:00
@yaphets666 那是反爬需要解决的
|
24
yaphets666 OP @CloudMx 哦大佬 我明白了 就是说如果我通过其他途径,比如说偷看别人电脑 获取了这个值 也是可以成功访问的? 但这就不属于 CSRF 范畴了对吧
|
25
oott123 2020-03-18 15:38:31 +08:00
CSRF 是用来防止你冒用别人的 cookies 的,不是用来防止你用你自己的
|
26
CloudMx 2020-03-18 15:57:35 +08:00
@yaphets666 你单单偷一个 Anti CSRF TOKEN 来,然后还能用的话,你就又可以玩 CSRF 攻击了(没有其他的防御措施)。
|
27
DDounx 2020-03-18 17:11:32 +08:00
我的认知里 CSRF Token 主要是用来判断提交的数据属否来源于这个网站的表单,所以是为了溯源用的。
|
28
hshpy 2020-03-18 17:24:15 +08:00
token 多数情况下 js 获取不到。
|
29
whoami9894 2020-03-18 18:09:53 +08:00
用 PostMan 就像你自己偷自己东西一样当然简单,实际情况里纯 CSRF 是没有办法通过 JS 获取 token 的,具体原因了解一下 SOP
|
30
wangxiaoaer 2020-03-18 18:41:11 +08:00 via Android
Csrf 是第三方网站是在已登录用户用户不知情的情况下向你的应用发送可操作后台数据的请求,比如常用的银行转帐的例子,大概原理是浏览器自动把 cookie 等发过去了。
现在我们要做的就是让这种非用户主动发起的请求失效: 1 你的应用压根没用到 cookie,那就不存在这个问题。 2 你的应用关键请求必须验证 referer 且不能为空,那么也不存在这个问题。(存疑) 2 你的应用用到了 cookie,那么后台验证就不能仅仅依赖 cookie,所以要额外加一个不通过 cookie 携带的验证参数,就是你题中说的 token 了。 至于这个 Token 怎么发送到前台就是另一个问题了: 2.1 页面返回的 HTML 中中加入隐藏参数。 2.2 放到某个不需要验证的请求的响应头中再存起来。 2.3 通过接口直接获取(存疑) ------------ 浅见,请指证。 |
31
yaphets666 OP |