0

我们开发了一个 iOS 框架,将分发给其他开发人员,以便在他们的应用程序中使用并使用我们将提供的一些服务。它工作得很好(体外)。但是,由于URL 加载系统在 iOS 中的工作方式,只需几行代码,每个开发人员的肉眼都可以看到我们所有的 URL,包括我们珍视的所有 HTTPS url。

我知道默默无闻的安全从来都不是一个好主意(被普遍误解的 HTTPS 总是在客户端之外透明所掩盖)但我仍然有这个要求,以某种方式使我们的 URL 对实现开发人员不可见。

到目前为止,我已经考虑NSURLConnection为我们的框架实现一个简单的替代方案,但考虑到 HTTPS 要求和所有内容,这似乎是一项艰巨的任务。

无论如何,我们可以阻止NSURLProtocol注册更多课程或任何其他选项吗?

以下是一些有关如何NSURLProtocol破坏您的安全性的示例代码:

 class NetSniffer : NSURLProtocol {

  override class func canInitWithRequest(request: NSURLRequest) -> Bool {
    print("\(request.URL?.absoluteURL)")
    return false
  }


}

在你的application(_, didFinishLaunchingWithOptions:)-> Bool

NSURLProtocol.registerClass(NetSniffer)

PS:我清楚地记得有一次我试图改变一些与AVPlayer创建自定义DRM相关的url连接的结果,并遇到了一些不寻常的事实,即没有一个数据连接是由NSURLProtocols触发的!这可能是一个线索?!

4

2 回答 2

1

如果你阻塞NSURLProtocol.registerClass,你会破坏很多有用的代码。

尝试隐藏 URL 是徒劳的。如果有人想对您的 API 进行逆向工程,他们会这样做。

于 2016-01-11T13:27:27.087 回答
0

好吧,我再一次回答了我自己的问题。解决方案实际上非常简单。幸运的是NSURLSession提供的比我想象的要多。您注册的每个类都NSURLProtocol只会影响defaultSessiono 如果您基于默认配置以外的配置创建新会话(并且不将 i 暴露给其他开发人员)将是安全的。但是,无论如何我所做的是:

  • 获取NSURLSessionConfiguration使用类的静态成员的实例,例如defaultConfiguration
  • 迭代其已注册的协议 ( registeredProtocols) 并一一取消注册。
  • NSURLSession基于此配置实例化一个新的。
  • 在新创建的会话上启动新的数据任务
  • 完成后处理会话。

到目前为止,我还没有找到一种方法来解决这个问题并从我的模块外部提取 URL。

让我知道它是否需要任何改进。

于 2016-01-13T04:39:15.033 回答