是否可以限制iOS应用仅与白名单域名进行通信?
可行性结论
该需求完全可通过ATS原生能力实现,若需要精确到路径级的访问限制,额外增加一层网络请求拦截即可。
配置步骤
要实现仅白名单域名可访问的效果,按照如下规则配置项目的Info.plist即可:
- 首先新增
NSAppTransportSecurity(类型为Dictionary)作为根键 - 在
NSAppTransportSecurity下新增NSAllowsArbitraryLoads(类型为Boolean),值设为false。该配置代表默认禁止所有非白名单域名的请求,同时要求所有请求默认满足ATS基础安全要求(TLS 1.2及以上、证书链合法等) - 在
NSAppTransportSecurity下新增NSExceptionDomains(类型为Dictionary),字典内的每一个键对应你要放行的白名单域名:- 若要同时放行域名的所有子域名,在对应域名的配置字典中新增
NSIncludesSubdomains(类型为Boolean),值设为true - 若白名单域名不符合ATS基础安全要求(比如用了低版本TLS、需要支持HTTP请求),可按需添加对应例外配置调整规则
- 若要同时放行域名的所有子域名,在对应域名的配置字典中新增
以下是对应需求的配置源码示例:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <false/> <key>NSExceptionDomains</key> <dict> <key>bank.com</key> <dict> <!-- 放行bank.com的所有子域名,不需要的话可以删掉这个配置 --> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict>
注意事项
- ATS仅能管控App通过
URLSession、WebKit等上层系统网络API发起的请求,如果你使用了BSD套接字、第三方原生C/C++网络库等底层接口发起请求,ATS无法拦截,需要自行在业务层做白名单校验 - ATS的白名单仅支持域名粒度的管控,无法直接限制特定路径。如果你需要仅允许访问
https://bank.com/api下的接口、禁止同域名其他路径的请求,可以在网络请求发起前做统一拦截,校验URL路径前缀是否符合要求,不符合则直接终止请求 - 白名单支持通配符配置,比如
*.bank.com可以匹配所有bank.com的二级子域名
内容的提问来源于stack exchange,提问作者Taylor Kline
相关产品推荐
相关产品推荐

