【发布时间】:2020-08-07 00:01:30
【问题描述】:
我创建了一个可以正常工作的 Web 服务。但是,一旦我在 config/main.php 中启用 CSRF 验证,我就会在尝试使用 Web 服务时收到错误消息:
无法验证 CSRF 令牌。
除了跳过 CSRF 令牌验证之外,还有其他解决方案吗?
通过 Android 应用程序使用 Web 服务时,有没有办法实际验证 CSRF 令牌成功?
【问题讨论】:
标签: android security post yii csrf
我创建了一个可以正常工作的 Web 服务。但是,一旦我在 config/main.php 中启用 CSRF 验证,我就会在尝试使用 Web 服务时收到错误消息:
无法验证 CSRF 令牌。
除了跳过 CSRF 令牌验证之外,还有其他解决方案吗?
通过 Android 应用程序使用 Web 服务时,有没有办法实际验证 CSRF 令牌成功?
【问题讨论】:
标签: android security post yii csrf
这取决于问题中未提及的多项内容。
第一个问题是身份验证如何在服务中工作。如果是客户端浏览器不会自动发送的内容(即不是基于 cookie,而是例如添加到请求标头的令牌),则服务不会受到 CSRF 的攻击,您可以关闭 csrf 保护。
如果它使用 cookie(大多数时候可能不是最好的服务),那么你需要保护它免受 CSRF 的影响。至于如何,这取决于实施什么保护。如果它是标准的synchronizer token pattern,那么您需要首先通过 GET 下载一个页面,提取令牌并在随后的 POST/PUT/DELETE 请求中将其发送回相应的字段中。这在移动应用程序中看起来很尴尬,最好将 API 更改为基于令牌的身份验证。 :) 如果它类似于double posting,您可能能够制作服务中接受的双重发布令牌。如果是其他问题,您需要了解保护的工作原理,并了解如何将正确的内容实际传递给服务。
作为旁注,不仅基于 cookie 的身份验证可能容易受到 CSRF 的攻击。例如,如果 API 使用 HTTP 基本身份验证,它也会被浏览器缓存并自动发送,因此如果用户直接在浏览器中输入凭据,它很容易受到 CSRF 的攻击(但这是一个奇怪的用例,可以降低风险)。客户端证书也由浏览器自动发送,同样容易受到 CSRF 的攻击。
所以总结一下(有点简化,详见上文):
另外请注意,如果在服务上启用了 CORS(移动应用不需要),这在 CSRF 方面会使事情变得有点复杂,但这是一个正交问题。
【讨论】: