【问题标题】:How to validate CSRF tokens?如何验证 CSRF 令牌?
【发布时间】:2017-12-14 04:28:04
【问题描述】:

我正在尝试使用 Hapi 的插件 Crumb 来实施针对 CSRF 攻击的解决方案,但似乎我没有得到解决方案流程。 我可以简单地将每个 http 响应中的令牌设置为 cookie。问题来了,如果令牌是由客户端发出的,REST 如何验证 CSRF 令牌? REST 后端如何理解这个随机字符串对这个请求有效而另一个随机字符串不是?

【问题讨论】:

    标签: token csrf hapijs


    【解决方案1】:

    不能在客户端生成CSRF token。应该先从服务端发送到客户端,有的JS框架会自动从cookie中提取出来发送给服务端。 p>

    基本思想是用户应该发送令牌连同 cookie 以及发布数据。这是一个简单的例子。如果攻击者会欺骗用户向服务发送特定请求,例如恶意网站可以拥有带有此链接src="gmail.com/deleteaccount=true" 的图像。如果用户登录到 gmail。 Gmail 会认为是用户发出了请求,因为随请求一起发送的 cookie 是有效的。因此,为了确保它实际上是一个用户,gmail 还需要一个带有请求数据的令牌发送:所以不是gmail.com/deleteaccount=true 它需要gmail.com/deleteaccount=true&token=987y23459827345sdfg. 令牌必须匹配存储在 cookie 中的那个。因此,当服务器接收到请求时,它会检查 cookie 中的令牌是否等于请求正文中的令牌。攻击者无权访问用户的 cookie,也不知道令牌。 这是简化的数据流:

    更详细地说,它看起来像这样:

    • 1) 用户向服务器发送 GET 请求
    • 2) 服务器将 cookie 设置为 sessionid,并使用令牌保存会话数据
    • 3) 服务器返回带有隐藏字段中标记的表单的 HTML。
    • 4) 用户提交 表单,以及一个隐藏字段
    • 5) 服务器比较来自 带有保存在会话存储中的令牌的提交表单(隐藏字段)。如果它们匹配,则表示该表单是由用户提交的。

    这是另一个很好的答案:Why is it common to put CSRF prevention tokens in cookies?

    【讨论】:

    • 这意味着当用户发帖时,随机生成的令牌立即保存在cookie中,当它到达服务器时,服务器检查cookie令牌和请求令牌是否相同。如果它相同,那么它提供访问权限??? @RB_
    • @WahidSherif 在最简单的形式中,它将是这样的:1 - 您在用户的会话中保存一个令牌。 2 - 您将包含相同标记的隐藏字段添加到您正在呈现的表单中。提交表单时,它包含 CSRF 令牌,因此您知道该表单是由用户提交的。
    • 例如,X 是服务器,Y 是用户。每次 Y 向 X 发布内容时都会生成一个令牌。当 Y 提交表单时,令牌会保存在 Y 的会话中。令牌也作为服务器 X 的隐藏字段。X 检查会话令牌和 Y 的隐藏令牌。如果它们匹配 X 允许进入。 ??
    • 我猜你可以这样说,但你不必为每个表单 POST 生成一个新的令牌,只需为每个会话生成 1 个令牌。
    • 服务器如何知道我在当前会话中生成了一个已知令牌?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2016-01-08
    • 2014-07-12
    • 2018-05-10
    • 2019-03-22
    • 2018-02-01
    • 2018-07-13
    相关资源
    最近更新 更多