V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yaphets666
V2EX  ›  问与答

请问为什么 token 能抵御 csrf?

  •  
  •   yaphets666 · 2020-03-18 14:22:19 +08:00 · 5757 次点击
    这是一个创建于 1746 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果我冒用 token 用 postman 发送一个请求 不是一样可以成功吗? 但是实际上我测试了一个网站是不可以的. 这个网站还很有趣的返回了成功的提示消息

    31 条回复    2020-03-20 11:44:50 +08:00
    zzNucker
        1
    zzNucker  
       2020-03-18 14:27:47 +08:00
    你都能冒用 token 了 说明你已经能够完整控制一个网站的前端了

    这种情况下需要防御的不是 csrf 了

    是 xss
    b821025551b
        2
    b821025551b  
       2020-03-18 14:28:40 +08:00   ❤️ 1
    请好好理解一下什么是 csrf
    littleylv
        3
    littleylv  
       2020-03-18 14:30:24 +08:00   ❤️ 1
    请好好理解一下什么是 csrf +1
    yaphets666
        4
    yaphets666  
    OP
       2020-03-18 14:36:01 +08:00
    @littleylv
    @b821025551b token 不是抵御 csrf 的机制之一吗? 请大佬指点
    yaphets666
        5
    yaphets666  
    OP
       2020-03-18 14:44:00 +08:00
    @zzNucker 可能我理解的冒用 token 理解有误,token 不是很好获取吗?
    lhx2008
        6
    lhx2008  
       2020-03-18 14:49:02 +08:00
    我理解 CSRF 通常是一步操作,比如说一个提交。但是加了 token 之后, 变成了两步(获取 Token + 发送 Token ),而在第三方网站要同时做到读取和发送是不太可能的。
    chinafeng
        7
    chinafeng  
       2020-03-18 14:49:06 +08:00
    @yaphets666 #4 去看一下 CSRF 原理,比如你现在在 V2EX,我通过脚本等方式直接在后台发了个帖子,你想想 Token 的作用
    chinafeng
        8
    chinafeng  
       2020-03-18 14:50:23 +08:00
    每次请求时 CSRF Token 都是不同的,你除非能控制前端,否则如何成功呢?
    murmur
        9
    murmur  
       2020-03-18 14:52:08 +08:00   ❤️ 1
    csrf 解决的是冒用 cookies 层面的问题
    liuxey
        10
    liuxey  
       2020-03-18 14:52:59 +08:00
    “如果我冒用 token” 这几字就表示和 CSRF 已经没关系了

    CSRF 中文名字叫:跨站请求伪造,你都能拿到 token 了,就不需要伪造,直接爆破

    最近 web 基础差的人不少啊
    yaphets666
        11
    yaphets666  
    OP
       2020-03-18 14:59:48 +08:00
    @chinafeng 意思是 csrf 这个 token 和用来登录的 token 还不是一个东西? csrf 这个 token 是每发送一个新的请求,就在前端生成一个 token,后端验证?
    yaphets666
        12
    yaphets666  
    OP
       2020-03-18 15:00:31 +08:00
    @liuxey 我的意思是获取到用于登录的 token 这个 token 不是固定的吗?
    chinafeng
        13
    chinafeng  
       2020-03-18 15:02:48 +08:00
    @yaphets666 #11 你指的登录的 Token 是什么东西? CSRF Token 的话,你目前正在看的这个帖子就有,View Page Source 看看吧,多刷新几次页面
    q8164305
        14
    q8164305  
       2020-03-18 15:05:14 +08:00 via Android
    csrf 主要防钓鱼网站的
    yaphets666
        15
    yaphets666  
    OP
       2020-03-18 15:08:38 +08:00
    @chinafeng 登录 token 就是用于保持登录状态的 token,是这样的,我从 github 上找到一个开源项目叫 renrenfast,前端代码是每次请求都携带登录成功时后端返回的 token 用于保持登录状态. 而 CSRF Token 是每次请求都新生成一个,次次不同,我理解的对吗?
    ooh
        16
    ooh  
       2020-03-18 15:09:58 +08:00
    你获取我的 Token 康康
    yaphets666
        17
    yaphets666  
    OP
       2020-03-18 15:12:18 +08:00
    @ooh 场景是这样的...我自己"偷"我自己的 token 我从浏览器直接复制过来
    Telegram
        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,也不会成功
    chinafeng
        19
    chinafeng  
       2020-03-18 15:18:08 +08:00
    @yaphets666 #15 这两个 Token 不是一个东西,前者应该是程序自定义的一个令牌,CSRF 是一套规范
    CloudMx
        20
    CloudMx  
       2020-03-18 15:20:14 +08:00
    这里的 Token 是 Anti csrf Token,核心点就是随机值(时效性在这里相对随机特性弱很多),你是怎么猜,怎么算都算不出来的一个值,除非你借助了其他安全问题来获取这个值,而且这个值还没失效。
    CloudMx
        21
    CloudMx  
       2020-03-18 15:23:12 +08:00
    @CloudMx 我把大家常说的这个 Token 设置为纯数字也是一样的道理,不在意是什么值,只在意在使用一次或者短时间内使用范围,你猜不出来。
    b821025551b
        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 范畴。
    murmur
        23
    murmur  
       2020-03-18 15:29:29 +08:00
    @yaphets666 那是反爬需要解决的
    yaphets666
        24
    yaphets666  
    OP
       2020-03-18 15:38:22 +08:00
    @CloudMx 哦大佬 我明白了 就是说如果我通过其他途径,比如说偷看别人电脑 获取了这个值 也是可以成功访问的? 但这就不属于 CSRF 范畴了对吧
    oott123
        25
    oott123  
       2020-03-18 15:38:31 +08:00
    CSRF 是用来防止你冒用别人的 cookies 的,不是用来防止你用你自己的
    CloudMx
        26
    CloudMx  
       2020-03-18 15:57:35 +08:00
    @yaphets666 你单单偷一个 Anti CSRF TOKEN 来,然后还能用的话,你就又可以玩 CSRF 攻击了(没有其他的防御措施)。
    DDounx
        27
    DDounx  
       2020-03-18 17:11:32 +08:00
    我的认知里 CSRF Token 主要是用来判断提交的数据属否来源于这个网站的表单,所以是为了溯源用的。
    hshpy
        28
    hshpy  
       2020-03-18 17:24:15 +08:00
    token 多数情况下 js 获取不到。
    whoami9894
        29
    whoami9894  
       2020-03-18 18:09:53 +08:00
    用 PostMan 就像你自己偷自己东西一样当然简单,实际情况里纯 CSRF 是没有办法通过 JS 获取 token 的,具体原因了解一下 SOP
    wangxiaoaer
        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 通过接口直接获取(存疑)

    ------------

    浅见,请指证。
    yaphets666
        31
    yaphets666  
    OP
       2020-03-20 11:44:50 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2902 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:05 · PVG 17:05 · LAX 01:05 · JFK 04:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.