解决iOS应用ATS拦截HTTP资源加载问题
2025-01-23 02:20:46
解决 iOS 应用中的 ATS 清除文本 HTTP 资源拦截问题
当开发 iOS 应用时,开发者有时会遇到“App Transport Security has blocked a cleartext HTTP (http://) resource load”的错误。 这个错误表明应用试图通过不安全的 HTTP 协议加载资源,而 iOS 的应用传输安全(ATS)机制阻止了它。 理解这个错误,以及如何正确配置 ATS 是至关重要的。
问题根源
ATS 旨在强制应用使用安全的 HTTPS 连接,以保护用户的数据安全。默认情况下,ATS 会拦截任何使用 HTTP 的网络请求。尽管你可能已经在代码中使用了 https://
开头的 URL,问题依旧可能出现。例如,外部的 API 或者其他资源或许会将请求重定向到 HTTP 网址。 或者像文中提到的案例,可能是API本身也支持http协议,在服务端返回http协议相关的资源。 在排查这类问题时, 需要关注请求的实际发起 URL 以及任何重定向情况, 而不仅仅是代码中书写的URL。
解决方案一:临时禁用 ATS (不推荐)
虽然不建议这样做,但在某些极端情况下,可以临时禁用 ATS 来允许 HTTP 请求。但这会使应用易受中间人攻击,风险很大。该方法只能在调试和开发过程中短期使用,并需要在生产版本中将其移除。
操作步骤:
- 打开项目的
Info.plist
文件。 - 添加一个名为
NSAppTransportSecurity
的字典。 - 在
NSAppTransportSecurity
字典中添加一个名为NSAllowsArbitraryLoads
的布尔值,并将其设置为YES
。
代码示例:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
这种方法会禁用 ATS,允许所有 HTTP 请求。务必谨慎使用。
解决方案二:针对特定域名启用 HTTP 访问
一个更为安全的方式是仅对需要使用 HTTP 协议的特定域名允许访问。这种方法比完全禁用 ATS 更具安全性。你需要明确列出需要允许 HTTP 的域名。
操作步骤:
- 打开项目的
Info.plist
文件。 - 添加一个名为
NSAppTransportSecurity
的字典。 - 在
NSAppTransportSecurity
字典中,创建一个名为NSExceptionDomains
的字典。 - 在
NSExceptionDomains
字典中,为需要访问的域名添加子字典(如swapi.co
)。 - 在子字典中,添加
NSIncludesSubdomains
设置为YES
,以及添加NSTemporaryExceptionAllowsInsecureHTTPLoads
并设置为YES
。 - (可选)如果只针对某个指定端口做调整,添加
NSExceptionMinimumTLSVersion
、NSExceptionRequiresForwardSecrecy
。
代码示例:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>swapi.co</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!-- 仅针对特定端口添加,一般情况可以不用 -->
<!-- <key>NSExceptionMinimumTLSVersion</key> -->
<!-- <string>TLSv1.1</string> -->
<!-- <key>NSExceptionRequiresForwardSecrecy</key> -->
<!--<true/> -->
</dict>
</dict>
</dict>
此配置只允许访问 swapi.co
及其子域下的 HTTP 资源,保持其他网络连接的安全性。务必只允许确实需要 HTTP 的域名,减少安全风险。
解决方案三:使用 HTTPS API 或服务
最理想的解决方案是使用 HTTPS API 或服务,它在保证数据传输安全方面是最佳实践。尽量避免使用 HTTP。当外部服务不提供 HTTPS 支持时,可尝试使用一些服务或者API代理来实现https访问。
操作步骤:
- 查找目标 API 或服务的 HTTPS 版本,确认该 API 是否提供 HTTPS 版本的接口。
- 替换代码中所有使用的 HTTP URL 为 HTTPS URL。
- 如果原始API无法替换,则需考虑使用一些云端API代理,做请求转发,并且在代理层把http转成https。
- 再次测试你的应用以确保新的 HTTPS 连接是生效的。
代码示例:
以假设 swapi.co
官方已经更新了HTTPS接口。则修改初始的网络请求baseUrl
:
struct NetworkManager {
let baseURL = "https://swapi.dev/api/" //修改baseUrl使用 https
...
}
注意修改baseUrl之后,需要做相应代码检查和回归测试,保证业务功能的正确性。
安全建议
始终优先考虑 HTTPS 连接,除非有充分的理由使用 HTTP。 在配置 ATS 时,应尽可能做到最精细化。仅对必需的域名放松限制,避免无差别的 HTTP 访问,这样能大大降低安全风险。 定期检查并更新应用的第三方库或组件,确保使用HTTPS版本的服务,并定期审视应用的 ATS 设置。当第三方依赖或api地址变化时,也要注意是否需要对ATS的设置进行调整。 使用SSL/TLS 协议的服务器会给访问请求带来安全性和保护性。 推荐使用高于TLSv1.2或TLSv1.3的协议版本,这样安全性更强。
请注意:对ATS 的修改务必谨慎,尤其是在应用上线时。对于涉及到用户隐私或者敏感信息的请求,需要保证数据的安全性。 在应用上架App Store前,仔细检查AppTransportSecurity 的配置项。