ios - 为什么不应该直接调用收据验证端点
问题描述
Apple 提供了一个端点来验证收据: https ://buy.itunes.apple.com/verifyReceipt并警告不要从应用程序调用端点
无法直接在用户设备和 App Store 之间建立受信任的连接,因为您无法控制该连接的任何一端,因此很容易受到中间人攻击。
据说,安全的方法是先将收据发送到“我自己的”服务器,然后从自己的服务器与 Apple 端点通信。
老实说,我不明白它如何帮助提高安全级别。是的,我不控制/verifyReceipt
端点,但苹果希望可以。以及为什么
手机<->我的服务器<->苹果服务器比手机<->苹果服务器好?
您能否从黑客(或中间人)的角度详细说明这一点?在后一种情况下,他将如何篡改收据/回复?在前一种情况下,是什么让他感到困难?
解决方案
更改应用程序二进制文件以更改应用程序中的字符串相对容易。如果您的二进制文件包含字符串“ https://buy.itunes.apple.com/verifyReceipt ”,那么攻击者可以将字符串更改为“ https://example.com/verifyReceipt ”(受他们控制的服务器)并拥有服务器返回收据 JSON,使购买看起来像是成功的。这是一种易于自动化的攻击,因此您只需通过脚本运行二进制文件,该脚本将 Apple URL 的所有实例替换为另一个 URL。
当您将自己的服务器与 Apple 通信时,您可以(相对)确定该连接是安全的。还有一些方法可以保护应用程序和您的服务器之间的通信,例如应用程序二进制文件中的证书,其中包含一个公钥,即您服务器上的私钥。(我不是这部分的专家,所以关于键的细节可能不是 100% 正确的)。
话虽如此,攻击者还可以通过其他方式使其看起来像是一次购买。他们可以在您的应用程序二进制文件中搜索常见的收据解析库并翻转已知的布尔值(例如userCompletedPurchase
布尔标志)。这些攻击很容易编写脚本。
确保您的应用程序不受攻击的最佳方法是移除唾手可得的果实,并使常见脚本不会打开您的应用程序受到攻击变得更加困难。一种方法是不直接与 Apple 验证收据。
推荐阅读
- curl - 继续后,命令行 cURL 工具不会在失败时转储响应标头
- r - 基于多列计算数据框中的出现次数 - R
- python - 如何在 Python 中过滤具有特定条件的 netCDF 变量?
- java - 尝试在 Amazon EC2 集群上配置主从时,JMeter 抛出“java.net.ConnectException: Connection timed out (Connection timed out)”
- go - 无法在 go env 中安装 go 1.13。goenv install 1.13.6 失败 - go-build: definition not found: 1.13.6
- c++ - 什么是 Glew、Glut 和 glfw3?哪些在 Opengl 3/4 中已弃用
- python - 如何将嵌套的 JSON 转换为 CSV?
- service - 如何让 RUST 在后台优雅运行并进行守护?
- azure - Azure DevOps Pipelines 将 Docker 映像推送到容器注册表被拒绝
- python - 减少matplotlib中的X轴