【问题标题】:Can CSRF happen in an API?CSRF 可以在 API 中发生吗?
【发布时间】:2013-05-01 13:08:20
【问题描述】:

我们使用的 Web 应用程序框架内置了对处理跨站点请求伪造的支持。这在使用浏览器将数据发布到我们的网络服务器时效果很好。

目前我们正在开发一个 API,其中上传的 XML 文件由相同的应用程序框架处理。我们的 API 需要在上传的 XML 文件中使用唯一令牌进行身份验证。由于默认启用 CSRF 检测并且 XML 文件不包含 CSRF 令牌,我们目前无法通过此 API 上传任何数据。

但是,我们可以很容易地禁用 CSRF 检测,但这安全吗?

here 的帖子非常大胆地陈述了以下内容。

It is safe to remove csrf for API calls as the particular vulnerability can only be executed through a web browser.

这是真的吗?通过 API 不会发生与 CSRF 攻击类似的事情吗?

【问题讨论】:

    标签: api csrf


    【解决方案1】:

    这取决于您如何使用 API。假设使用 API 的网站易受 CSRF 攻击,则意味着该 API 也易受攻击。

    维基百科是这么说的

    CSRF 利用网站对用户浏览器的信任。

    为了支持 API 调用,服务器要求凭据与每个请求(或类似摘要、安全句柄、散列)一起发送。如果凭据存储在应用程序内存(如移动应用程序)中,则 API 不会受到 CSRF 的攻击。但是,如果凭据保存在会话或 cookie 中,则 API 会暴露给 CSRF

    【讨论】:

    • 简而言之:如果你使用会话、cookies或者http认证,你必须保持CSRF保护!
    • @kranthi117,请详细说明如果凭据存储在 cookie 中,它如何容易受到 CSRF 的攻击。由于 CSRF 攻击者无法读取 cookie,他如何欺骗包含 cookie 值的请求?
    • @Pacerier 我猜他的意思是凭据在 cookie 标头中发送到 API,因此它们由浏览器自动附加到每个请求,而不是由客户端应用程序......跨度>
    • @inf3rno,cookie 被发送到服务器,而不是攻击者。由于 CSRF 攻击者无法读取 cookie,他如何能够欺骗包含 cookie 值的请求?
    • @Pacerier 我不明白这个问题。 CSRF 是关于向您已登录的易受攻击的应用程序发送请求。因此,攻击者在不同的站点上向您发送表单,您单击帖子,浏览器将表单发送到带有会话 cookie 的易受攻击的应用程序。据我所知,只有当 JavaScript 应用程序使用历史 API 生成请求时,它们才会受到 CSRF 攻击。
    【解决方案2】:

    这取决于您所说的“禁用 CSRF 检测”。

    一些提示:

    • 只要您验证唯一的身份验证令牌没有失败,那么攻击者就无法在没有有效令牌的情况下欺骗有效请求。这很简单。

    • 这里的“唯一身份验证令牌”是指浏览器不会自动发送的东西。 (所以不要使用 HTTP Basic / DigestCookie 标头等内容。)它一定是您(API 创建者)想出的独特。这可以像附加 Foobar:the_unique_token 标头一样简单。

    • 请注意,根据Cookie(或浏览器自动发送的其他令牌)识别客户端是完全可以的,但您必须仅在提供唯一令牌时才允许进入。

    只要攻击者能够猜测/获取令牌(the_unique_token),就可以欺骗有效请求。因此,令牌需要长、随机且一次性使用才能安全。

    【讨论】:

    • 你的解决方案在 CSRF 部分是可以的,但是 REST 有一个无状态约束,它不允许我们将客户端会话存储在服务器上。所以我认为你也需要为此写一些东西。 ics.uci.edu/~fielding/pubs/dissertation/…
    猜你喜欢
    • 1970-01-01
    • 2019-01-04
    • 2011-05-26
    • 2013-07-31
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2011-09-07
    • 2015-05-05
    相关资源
    最近更新 更多