【问题标题】:CSRF validation with web services with android app使用 android 应用程序使用 Web 服务进行 CSRF 验证
【发布时间】:2020-08-07 00:01:30
【问题描述】:

我创建了一个可以正常工作的 Web 服务。但是,一旦我在 config/main.php 中启用 CSRF 验证,我就会在尝试使用 Web 服务时收到错误消息:

无法验证 CSRF 令牌。

除了跳过 CSRF 令牌验证之外,还有其他解决方案吗?

通过 Android 应用程序使用 Web 服务时,有没有办法实际验证 CSRF 令牌成功?

【问题讨论】:

    标签: android security post yii csrf


    【解决方案1】:

    这取决于问题中未提及的多项内容。

    第一个问题是身份验证如何在服务中工作。如果是客户端浏览器不会自动发送的内容(即不是基于 cookie,而是例如添加到请求标头的令牌),则服务不会受到 CSRF 的攻击,您可以关闭 csrf 保护。

    如果它使用 cookie(大多数时候可能不是最好的服务),那么你需要保护它免受 CSRF 的影响。至于如何,这取决于实施什么保护。如果它是标准的synchronizer token pattern,那么您需要首先通过 GET 下载一个页面,提取令牌并在随后的 POST/PUT/DELETE 请求中将其发送回相应的字段中。这在移动应用程序中看起来很尴尬,最好将 API 更改为基于令牌的身份验证。 :) 如果它类似于double posting,您可能能够制作服务中接受的双重发布令牌。如果是其他问题,您需要了解保护的工作原理,并了解如何将正确的内容实际传递给服务。

    作为旁注,不仅基于 cookie 的身份验证可能容易受到 CSRF 的攻击。例如,如果 API 使用 HTTP 基本身份验证,它也会被浏览器缓存并自动发送,因此如果用户直接在浏览器中输入凭据,它很容易受到 CSRF 的攻击(但这是一个奇怪的用例,可以降低风险)。客户端证书也由浏览器自动发送,同样容易受到 CSRF 的攻击。

    所以总结一下(有点简化,详见上文):

    1. 服务的身份验证是否基于 cookie?
      • 否 -> 移除 CSRF 保护,它不容易受到攻击(但请参阅上面的例外情况),完成。
      • 是 -> 2.
    2. 能否将身份验证更改为基于令牌(令牌在请求标头中发送)?
      • 是的 -> 更改它,完成。
      • 否 -> 3.
    3. CSRF保护的方法是什么?
      • 同步器令牌模式 -> 你需要获取一个页面才能使用令牌
      • 双重发布 -> 根据实现,您可以在 cookie 和标头中双重发布适当的值
      • 其他 -> 了解保护的工作原理以及如何发送正确的令牌

    另外请注意,如果在服务上启用了 CORS(移动应用不需要),这在 CSRF 方面会使事情变得有点复杂,但这是一个正交问题。

    【讨论】:

    • 感谢您的快速回复!!!我的身份验证服务不是基于 cookie 的,所以我删除了 CSRF 保护。但是现在对于每个新请求,它都会发送一个新的会话 ID,因为我的购物车中没有显示任何产品。当有人将产品添加到购物车时,它带有一些 session_id(sess_4qc418amqa6g69uicosu0jsou6),但在购物车页面上。它说零产品,因为购物车页面上的 session_id(sess_5mcj87a15b39o1r8fm9tp8gkl6) 已更改。我正在使用 yii1.1.17。
    • 看起来服务器的会话处理还有其他问题,当我从网络浏览器或邮递员调用网络服务时,它按预期工作,但是当我使用来自 android 应用程序的网络服务时,服务器将每个请求都视为新用户,因此每次都创建新会话。不确定是什么导致了问题,同一个应用在不同的服务器上运行良好。
    猜你喜欢
    • 2010-11-08
    • 2014-11-27
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2017-10-30
    相关资源
    最近更新 更多