如何保证对我的服务器的请求是由我的 iOS 应用程序在真实设备上生成的?

Posted

技术标签:

【中文标题】如何保证对我的服务器的请求是由我的 iOS 应用程序在真实设备上生成的?【英文标题】:How can I guarantee that requests to my server were generated by my iOS app on a real device? 【发布时间】:2015-01-24 18:41:08 【问题描述】:

我想从我的 ios 应用程序向我的服务器发送一条小消息。

但是,我希望高度确定数据实际上是:(1) 在设备上生成的,以及 (2) 由我的应用生成。

有没有办法做到这一点?我更关心 (1) 而不是 (2)。

Roku 早就有这样的功能了:http://sdkdocs.roku.com/display/sdkdoc/Channel+Packaging+And+Publishing#ChannelPackagingAndPublishing-37ContentSecurityModel

每个 Roku 盒子都有一个由 Roku 签名的唯一客户端证书 作为证书颁发机构。该固件还支持特殊的 标头,x-roku-reserved-dev-id,总是发送开发者 id 当前运行的应用程序。由于这是权威且 不能伪造,开发者的web服务器只能接受 来自运行其应用程序的 Roku 流媒体播放器的连接。 同样,Roku Streaming Player 可以强制它正在与之交谈 开发者的 Web 服务器,包括 CA 证书 在其频道中颁发其 Web 服务器证书的机构 应用。

【问题讨论】:

在我看来,2 应该是优先级。如果 2 为真,那么 1 也必须为真。因为没有人可以在除 idevice 之外的任何设备上运行您的应用! 但是攻击者可以编写自己的代码,他们不需要使用应用程序或设备。最重要的是,连接的人具有正确的凭据,必须与每个消息/请求一起发送。 Zaph:查看 Roku 文档和 sdkdocs.roku.com/display/sdkdoc/roUrlTransfer 的描述。即使编写自己的代码也无法破坏这些检查。您需要提取 Roku 设备的烧录证书(这“非常困难”)。应用程序提供商可以使用这样的功能来阻止 3rd 方客户端(无需讨论这是否是一件好事)。 是的,一个“烧录证书”,如果你能在应用程序中得到一个你就是金子。 @zaph,您的服务器和您的应用程序之间的通信当然需要:1. 安全,2. 已验证(使用某种密码来验证它是否来自您的应用程序) 【参考方案1】:

通常您会在发出请求时添加此类信息。您可以添加其他标头来指定有关您的设备、应用程序、其版本等任何内容的信息。

示例:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.example.com"]];
[request addValue:@"iOS" forHTTPHeaderField:@"X-platform-name"];
[request addValue:@"ApplicationName" forHTTPHeaderField:@"X-application-name"];

更好

[request addValue:[UIDevice currentDevice].model forHTTPHeaderField:@"X-platform-name"];

您也可以使用 javascript 进行检查

var iOS = false;
var p = navigator.platform;

if( p === 'iPad' || p === 'iPhone' || p === 'iPod' )
    iOS = true;

【讨论】:

这很容易被欺骗。如果安全性很重要,则标头中发送的值必须是只有应用程序才能创建的值,并且可以由服务器验证。

以上是关于如何保证对我的服务器的请求是由我的 iOS 应用程序在真实设备上生成的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在异步协程中包装同步函数?

当特定类型的推送通知到达时,如何不允许 iOS 启动应用程序?

如何给我想要对我的应用进行 Beta 测试的朋友一份 iOS 7 副本? [关闭]

iOS 7 更新对我的应用程序的影响

如何监控 http 请求以便在我的 ios 应用程序中查看我的标头请求,内置反应本机

验证/签署对我的 API 的请求来自我的应用程序并且没有被欺骗(React Native)