关于iOS HTML安全的简单策略–下卷
时隔三年,终于要写下卷了,其实这个方法早就想好的了,但貌似大家不是很喜欢关注本地HTML安全的问题,主要是跨平台的手段太多了HTML不是一个优秀的“解”。
上卷说到加密的HTML放置于本地,等到App运行的时候才去解密。我们预期最终的一个方案就是用到的时候,没有用到时候就保持一个原有的加密状态。这是预期效果,思路就是获取相应的js的一个加载路径,动态去解码js文件。
1.可行性分析
1.1.NSURLProtocol
动态去加载JS的关键就是NSURLProtocol,这是个什么东西呢?简单来说一个网络层的处理代理,里面有几个关键的方法,网上相关的文章也有很多,这里就不做详细的讲解了,关于一些循环的问题,可以参考
/**
* 关键方法,防止循环调用,
* 但理论上我们只是使用本地的flie没有发起网络请求,
* 应该不会存在这个问题。,算是一个拓展了解。
* 这顺带提一下
*/
[NSURLProtocol propertyForKey:@"xxxxxx" inRequest:request]
的用法。
// 有三个类方法,两个对象方,这五个方法需要依次实现。
// 这里是判断如何是否需要处理我们的一个网络请求
//在我们这个需求里面,可以看作是否要拦截我们的请求
+ (BOOL)canInitWithRequest:(NSURLRequest *)request;
// 拦截下来的NSURLRequest收否需要额外的处理,这里是用于做重定向的
+ (NSURLRequest *) canonicalRequestForRequest:(NSURLRequest *)request;
// 这里是判断是否与缓存是同一个请求,如果是就使用缓存,如果不是,就重新请求。
+ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b;
// 开始处理请求
// 成功拦截了请求
// 系统将自动初始化一个你注册出来的NSURLProtocol子类出来处理请求。
- (void)startLoading;
// 请求结束了,这里不管是正常结束还是出错都会走这方法。
- (void)stopLoading;
看完了NSURLProtocol的关键方法,我们来看看关键属性:
/**
* client是一个代理对象,这里由网络请求的底层去管理,
* 会自动给NSURLProtocol赋值。这里无需去探究client具体是什么
* 对象
*/
@property (nullable, readonly, retain) id <NSURLProtocolClient> client;
/**
* 关于NSURLProtocolClient关键代理,
* 这里的方法系统已经实现了,
* 只需要开发者在适当的时机调用就好了
*/
/*!
* 这里是重定向,很大程度上是返回一个新的Response
*/
- (void)URLProtocol:(NSURLProtocol *)protocol wasRedirectedToRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse;
/*!
* 去查找一个缓存的Response
*/
- (void)URLProtocol:(NSURLProtocol *)protocol cachedResponseIsValid:(NSCachedURLResponse *)cachedResponse;
/*!
* 返回一个已经实现的response,并添加缓存
*/
- (void)URLProtocol:(NSURLProtocol *)protocol didReceiveResponse:(NSURLResponse *)response cacheStoragePolicy:(NSURLCacheStoragePolicy)p