防止 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。
如果需要任何改进,请告诉我。
我们已经开发了一个 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。
如果需要任何改进,请告诉我。