首页 » 移动 » 升级到iOS10后,对App Transport Security的处理

升级到iOS10后,对App Transport Security的处理

 

ATS 全称 App Transport Security,是 iOS 9 引入的一套安全机制,默认行为会强制保证所有的网络请求都使用 HTTPS。相信这个大家都有所了解。 在 iOS 10 中苹果对 ATS 的安全机制更加进步了一层,咱们来聊聊吧。

ATS 简介

如果你在 iOS 9 以上平台编译项目后,你会发现无论你使用 NSURLSession 请求接口数据,或者使用 WebView 打开网页,只要不是 HTTPS 协议都会失败。造成这个现象的原因就是 iOS 9 引入的 ATS 机制。

当然,苹果在引入这个特性的时候,也会考虑到开发者的过渡问题,所以还为我们留了一个开关,只需要在 Info.plist 中加上这个节点即可关闭 ATS 的默认行为:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

其中 NSAppTransportSecurity 是 ATS 设置项的根节点, NSAllowsArbitraryLoads 代表是否允许访问任意资源。 我们只需要将这个属性设置为 true, 就可以关闭 ATS 的默认拦截行为,继续使用 HTTP 了。

iOS 10 中的变化

iOS 10 依然延续了 ATS 机制。并且把它加强了。 从苹果官方目前发布出来的消息上看, 在 2017 年一月份开始,就不再允许开发者打开 NSAllowsArbitraryLoads 设置了。

也就是说,这种将 ATS 全局关闭的能力不给我们了。 可见苹果这次的决心。

那么,我们不能全局关闭 ATS 是否就意味着我们必须强制使用 HTTPS 呢? 下面咱们继续讨论。

ATS 除了提供一个 NSAllowsArbitraryLoads 属性,其实还有另外的属性。 可以设置 NSExceptionDomains 属性来将需要排除强制验证的域名写进来。 也就是说我如果我们的 app 只访问我们自己的服务器, 我们可以将我们服务器的域名添加进来,依然可以继续使用 HTTP。但我们不能像之前那样简单粗暴的直接把所有的请求都通过。这样就更加精确,其实对真正的用户来说,这其实是一个好事。尽管他们或许感知不到,但这样确实可以极大的减少用户的安全风险。

NSExceptionDomains 的设置方法如下, 比如我们要将 sapze.com 这个域名排除在 ATS 验证之外,就可以这样:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>sapze.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>

上面说的是在我们已经确定 App 所访问的数据范围的情况下的处理方法。 但还有一种情况, 如果我们开发的是类似浏览器的 App。这样用户需要输入任意的地址,那怎么办呢? 我们不可能把所有的域名都写到 NSExceptionDomains 里面。

这就可以使用 iOS 10 对 ATS 提供的一个新属性 NSAllowsArbitraryLoadsInWebContent。 顾名思义了,就是只允许加载任意类型的 web 内容。这样我们的 WKWebView 就可以加载任何类型的页面了。

使用 NSAllowsArbitraryLoadsInWebContent 的例子:

NSAppTransportSecurity

NSAllowsArbitraryLoadsInWebContent

结尾

总之 iOS 10 之后,对于 ATS 的安全保护会更加加强。也能看出苹果对于尽可能的去掉 HTTP 不安全性的决心。所以大家如果在提交新 App 的时候,需要注意一下这个特性,并及时作出相应的调整

原文链接:升级到iOS10后,对App Transport Security的处理,转载请注明来源!