NSURLSession跨域重定向透传HTTP Header问题解决

 更新时间:2022年11月30日 11:20:41   作者:波儿菜  
这篇文章主要为大家介绍了NSURLSession跨域重定向透传HTTP Header问题解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景

在源网页通过服务器重定向打开某个三方网页,网络层出现了 -1005 (NSURLErrorNetworkConnectionLost) 错误码,排查差异后发现是由于给这个三方服务带了源网页特有的 HTTP Header,导致服务器检查异常从而断开连接。

核心原因是跨域重定向场景透传了 Header 带到了三方服务,这有些不符合常理,会带来两个明显的问题:

  • 敏感 HTTP Header 传递给三方服务,存在隐私安全问题;
  • 服务收到未预期的 HTTP Header,可能被视为非法访问,导致网页异常;

系统库如何设计的

NSURLSession 在跨域重定向场景默认会透传 HTTP Header,参考 Swift 在 _HTTPURLProtocol 的相关处理:

    /// If the response is a redirect, return the new request
    /// RFC 7231 section 6.4 defines redirection behavior for HTTP/1.1
    /// - SeeAlso: <https://tools.ietf.org/html/rfc7231#section-6.4>
    func redirectRequest(for response: HTTPURLResponse, fromRequest: URLRequest) -> URLRequest? {
        //TODO: Do we ever want to redirect for HEAD requests?
        guard
            let location = response.value(forHeaderField: .location),
            let targetURL = URL(string: location)
            else {
                // Can't redirect when there's no location to redirect to.
                return nil
        }
        var request = fromRequest
        // Check for a redirect:
        switch response.statusCode {
            case 301...302 where request.httpMethod == "POST", 303:
                // Change "POST" into "GET" but leave other methods unchanged:
                request.httpMethod = "GET"
                request.httpBody = nil
            case 301...302, 305...308:
                // Re-use existing method:
                break
            default:
                return nil
        }
        // If targetURL has only relative path of url, create a new valid url with relative path
        // Otherwise, return request with targetURL ie.url from location field
        guard targetURL.scheme == nil || targetURL.host == nil else {
            request.url = targetURL
            return request
        }
	… (后面是相对路径处理)
    }

大致处理流程为:

  • 取出响应头 Location 字段作为目标 URL;
  • 若为 POST 请求改为 GET 请求并清空其 Body;
  • 若目标 URL 为相对路径,补齐完整 URL;

可以看到重定向后的请求会直接继承 HTTP Header,这个处理遵循了 RFC 7231 的规范,大致去翻了一下,只描述了 Location header field 的处理方法,而没有说明其它请求头该如何处理,在 Chrome 下重定向场景应该是直接丢弃之前的 Header 的。

我们知道有一个公开代理方法…willPerformHTTPRedirection…可以去改变重定向请求,但如果不借助网络拦截技术,WebKit 里面的请求也无法修改,顺便看一下 WebKit 内部是否对这种场景有所处理。

WebKit 是在 NetworkSessionCocoa 类里面承载 NSURLSession 请求的,实现了URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:协议,顺着处理链路从 Network 进程跟到 Web 进程再跟到 APP 进程,都没有找到关于跨域重定向清理 HTTP Header 的处理,更不用说公开配置能力了。

解决方案

针对 WebView 需要跨域重定向的场景,如何避免私有 HTTP Header 传递给目标请求服务?

方案一

如果前置请求是为了做统计上报,那可以直接跳转到目标 URL,前置请求旁路去处理;如果前置请求是为了获取跳转的地址,那么可以发起一个 Ajax 请求拿到回包后去跳转目标 URL。

或者更直接的,把 server-side redirect 改为 client-side redirect,让前置请求返回文档,文档内部进行document.replace()等函数跳转到目标 URL,但这种处理会让性能劣化,并且会导致前置请求关联的 Web 进程历史栈缓存被清理

核心思想就是避免服务器跨域重定向,由于和 Chrome 内核表现不一致且前端改造成本较大,一般较难实施,但这对于没有 WebKit 网络拦截技术的 APP 来说可能是唯一思路。

方案二

如果有 WebKit 网络拦截技术,那处理就比较简单了,只需要保证在重定向请求发起之前,如果主域名发生变化,就把 APP 私有的请求头清理掉,较简单的规避系统设计问题。

以上就是NSURLSession跨域重定向透传HTTP Header问题解决的详细内容,更多关于NSURLSession跨域重定向的资料请关注脚本之家其它相关文章!

相关文章

  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    这篇文章主要介绍了ios 使用xcode11 新建项目工程 (值得注意的问题),本文分步骤通过图文的形式给大家展示,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • iOS中CPU线程调试的高级技巧分享

    iOS中CPU线程调试的高级技巧分享

    这篇文章主要给大家介绍了关于iOS中CPU线程调试的高级技巧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • iOS应用开发中图片的拉伸问题解决方案

    iOS应用开发中图片的拉伸问题解决方案

    这篇文章主要介绍了iOS应用开发中图片的拉伸问题解决方案,有时图片的拉伸只需要拉伸中间部分而不拉伸两端,这是本文所关注的问题,需要的朋友可以参考下
    2016-02-02
  • IOS开发过程中的消息通知--小红点

    IOS开发过程中的消息通知--小红点

    本文主要介绍了IOS开发过程中的消息通知--小红点的相关知识。大致分为两种方法:系统方法和自定义方法。下面跟着小编一起来看下吧
    2017-04-04
  • 查看iOS已上架App的Crash信息定位、应对处理方式的实例

    查看iOS已上架App的Crash信息定位、应对处理方式的实例

    下面小编就为大家带来一篇查看iOS已上架App的Crash信息定位、应对处理方式的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • iOS开发之App主题切换解决方案完整版(Swift版)

    iOS开发之App主题切换解决方案完整版(Swift版)

    这篇文章主要为大家详细介绍了iOS开发之App主题切换完整解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • iOS多线程应用开发中自定义NSOperation类的实例解析

    iOS多线程应用开发中自定义NSOperation类的实例解析

    这篇文章主要介绍了iOS多线程应用开发中自定义NSOperation类的实例解析,代码基于传统的Objective-C,需要的朋友可以参考下
    2016-01-01
  • 浅谈IOS屏幕刷新ADisplayLink

    浅谈IOS屏幕刷新ADisplayLink

    CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。本文将介绍它的使用,感兴趣的同学,可以参考下。
    2021-06-06
  • IOS实现视频动画效果的启动图

    IOS实现视频动画效果的启动图

    这篇文章实现的是一个关于启动页或者引导页的视频动画效果的实现过程,对于大家开发APP具有一定的参考借鉴价值,有需要的可以来看看。
    2016-09-09
  • iOS判断网络请求超时的方法

    iOS判断网络请求超时的方法

    本篇文章主要介绍了iOS判断网络请求超时的方法,现在分享给大家,也给大家做个参考。感兴趣的小伙伴们可以参考一下。
    2016-12-12

最新评论