【问题标题】:Does a single token protect against csrf in a RESTful API?单个令牌是否可以防止 RESTful API 中的 csrf?
【发布时间】:2020-04-17 05:33:32
【问题描述】:

假设我正在创建一个 RESTful API(如 Twitter API),我只需要一个密钥令牌即可访问端点 GET /messages

  • 例如,令牌需要通过标头access_token 发送。
  • 如果我不传递令牌,我会收到 4xx 错误。

在 RESTful API 场景中,这一切都是为了防止 CSRF 攻击吗?我的意思是,在 RESTful API 中,我没有使用 Cookie 来管理用户会话,因为这里的想法不是成为会话(无状态是 REST 的原则之一)。

我忘记了什么还是正确的?我不明白为什么除了访问令牌之外我还需要anti CSRF token

提前致谢!

【问题讨论】:

    标签: rest api http csrf access-token


    【解决方案1】:

    简短的回答:如果您的 access_token 不是 cookie,是的,它足以保护您免受 CSRF 的侵害。

    长答案:

    只有在 HTTP 客户端自动向服务器发送一些身份验证数据(通常是 cookie)时,才会发生 CSRF 攻击。关键是攻击者不需要知道 Cookie,如果网络用户使用同一个浏览器访问 2 个站点(您的站点和攻击者的站点),它会自动发送。

    为了反 CSRF,服务器向客户端发送一个私有令牌,浏览器不会自动将其发送给服务器(因此它不能是 cookie)。开发人员必须编写代码将令牌附加到每个后续请求。

    CSRF是Web浏览器使用Cookie的问题,如果你正在开发Web浏览器不使用的RESTful API,通常不需要关心CSRF

    【讨论】:

    • 非常感谢!我有最后一条评论:我看到在标题中使用 access_token 的唯一问题是,如果我的 RESTful API 发送带有“*”值的 Access Controll Allow Origin。在这种情况下,如果攻击者知道我的令牌(嗅探或其他东西),则可以进行跨站点请求。攻击者不会从浏览器中的 localStorage 获取令牌,因为出于安全原因浏览器不允许这样做。那正确吗?如果我的 API 像那样工作,这可能是一个“弱点”吗?
    • CSRF 攻击适用于攻击者不知道您的秘密数据的情况。因此,在您的实现中 CSRF 没有缺陷。如果攻击者“知道我的令牌(嗅探或其他)”,这是另一种攻击,您可以使用更详细的信息提出另一个问题。例如嗅探攻击,你可以简单地使用HTTPS来防御它
    【解决方案2】:

    @Bart 首先,CSRF 攻击通常来自受信任的用户。这意味着客户端已经成功地验证了自己的身份,可能会在休息 API 的情况下传递一个有效的令牌。攻击可能是通过让我们说一个可以改变资源状态的javascript。所以仅仅拥有一个密钥令牌并不能真正帮助避免 CSRF 攻击。

    有关 CSRF 的更多参考,请参阅以下 URL:-

    https://en.wikipedia.org/wiki/Cross-site_request_forgery

    像 Spring 这样的大多数框架都内置了对 CSRF 的支持。

    【讨论】:

    • "这意味着客户端已经成功地验证了自己,可能通过在休息 API 的情况下传递一个有效的令牌。攻击可能是通过传递一个可以改变资源状态的 javascript。 "如果我的 RESTful API 的所有请求中始终需要令牌,我就不再需要任何东西了,对吧?在您的示例中,您假设您登录了 RESTful API,并且下一个请求将不包含令牌,但 RESTful API 不会保存状态(会话),因为它必须使用令牌。 =/
    猜你喜欢
    • 2019-02-23
    • 2015-01-27
    • 2014-01-02
    • 1970-01-01
    • 2016-07-11
    • 2015-03-12
    • 2015-09-28
    • 1970-01-01
    • 2013-02-25
    相关资源
    最近更新 更多