防止 NSURLProtocol 实现读取 URL

Preventing NSURLProtocol implementations to read URLs

我们已经开发了一个 iOS 框架,可以分发给其他开发人员在他们的应用程序中使用,并利用我们提供的一些服务。它效果很好(体外)。但是,由于 URL Loading System 在 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)

P.S.: 我清楚地记得有一次我试图更改与 AVPlayer 相关的一些 url 连接的结果以创建自定义 DRM 并遇到了一些不寻常的事实,即 none 的数据连接是由 NSURLProtocol 触发的!会不会是线索?!

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

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

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

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

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

如果需要任何改进,请告诉我。