HTTP防劫持方案

2023-05-16

DNS污染检测
被改标题
被挂黑链
被入侵
检测网站是否被劫持
网站打开速度检测
网站是否被黑
域名是否被墙      网站监控 http://www.iis7.com/b/wzjk/?inviteCode=496

HTTP劫持是在使用者与其目的网络服务所建立的专用数据通道中,监视特定数据信息,提示当满足设定的条件时,就会在正常的数据流中插入精心设计的网络数据报文,目的是让用户端程序解释”错误”的数据,并以弹出新窗口的形式在使用者界面展示宣传性广告或者直接显示某网站的内容。

什么是HTTP劫持

在运营商的路由器节点上,设置协议检测,一旦发现是HTTP请求,而且是html类型请求,则拦截处理。后续做法往往分为2种,1种是类似DNS劫持返回302让用户浏览器跳转到另外的地址,还有1种是在服务器返回的 HTML 数据中插入 js 或 dom 节点,从而使网页中出现自己的广告等等垃圾信息。
看图你就懂了一切(虽然被劫持我也很绝望)
Alt text

URL Loading System

官方文档


   

1

2

3


   

The URL loading system is a set of classes and protocols that allow your app to access

content referenced by a URL. At the heart of this technology is the NSURL class, which

lets your app manipulate URLs and the resources they refer to.

 

官方配图About the URL Loading System
Alt text

NSURLCache

NSURLCache 为 URL 请求提供了内存中以及磁盘上的综合缓存机制。 作为基础类库 URL Loading System 的一部分,任何通过 NSURLConnection 加载的请求都将被 NSURLCache 处理。

当一个请求完成得到来自服务器的Response,在本地保存作为cache。下一次同一个请求再发起时,本地保存的Response就会马上返回,不需要连接服务器。NSURLCache 会 自动 且 透明 地返回回应。

在NSURLConnection加载系统中,缓存被设计为request对象的一个属性,由NSURLRequest对象的cachePolicy属性指定。而在NSURLSession加载系统中,缓存被设计为 NSURLSessionConfiguration对像的一个属性,该属性所指定的策略被该session的所有request所共享。

作为一个Cache,它头文件中提供的方法并不复杂,就是基本的增删查改,(其中增和改可以算是一个功能,没有就增,改就是覆盖)。主要方法仅六个:


   

1

2

3

4

5

6

7

8

9

10


   

// 初始化方法

- (instancetype)initWithMemoryCapacity:(NSUInteger)memoryCapacity diskCapacity:(NSUInteger)diskCapacity diskPath:(nullable NSString *)path;

// 查询方法

- (nullable NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request;

// 存储方法

- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request;

// 删除方法

- (void)removeCachedResponseForRequest:(NSURLRequest *)request;

- (void)removeAllCachedResponses;

- (void)removeCachedResponsesSinceDate:(NSDate *)date NS_AVAILABLE(10_10, 8_0);

 

当然,在项目中为了方便,我们一般都会实现一个子类,当系统调用URLCache的增删改查方法时,由子类来接管系统的URLCache功能。
NSURLCache的缓存策略,以及和HTTP header之间的关系,可以参考NSHipster NSURLCache文章

js签名防注入

这个方法主要用于资讯类App,就像文章开头那样的情况
步骤如下:
(1).发版前,在 bundle 中存一份最新的前端js文件
(2).后台在返回 js 文件 URL 的时候,对 js 文件内容进行 SHA-256 ,得到的 hash 值拼接到 js 的文件名中
(3).请求 js 资源文件时,在NSURLCache中的- (NSCachedURLResponse )cachedResponseForRequest:(NSURLRequest )request方法中拦截请求
(4).拦截请求之后,判断本地是否有缓存,如果有,则直接返回缓存文件包装成 response
(5).下载 js 资源时,走NSURLProtocol 代理方法- (void)connection:(NSURLConnection )connection didReceiveData:(NSData )data,对 data 进行SHA-256签名比对,如果签名一致,将 data 通过;如果签名不一致,代表 js 被污染,直接丢弃,从bundle取出本地预存的 js 文件返回回来。

基本逻辑如下(需要用到上文中NSURLCache实现的子类)
URLCache实现文件中:


   

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26


   

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request {

NSString* ua = [request valueForHTTPHeaderField:@"User-Agent"];

if (!EmptyString(ua) && [ua lf_containsSubString:@"AppleWebKit"]) {

if ([CacheManager shouldVerifyHashCode:request]) { //包含64位hashcode的js css文件

// 取本地JS缓存

NSData *resultData = [CacheManager getJSCache];

if (resultData) {

NSURLResponse *response = [[NSURLResponse alloc] initWithURL:request.URL MIMEType:nil expectedContentLength:resultData.length textEncodingName:nil];

return [[NSCachedURLResponse alloc] initWithResponse:response data:resultData];

} else {

return nil;

}

}

return [super cachedResponseForRequest:request];

}

- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request {

NSString* ua = [request valueForHTTPHeaderField:@"User-Agent"];

if ([CacheManager shouldVerifyHashCode:request] && [ua lf_containsSubString:@"AppleWebKit"]) {

// 将请求回来的,并且通过验证的新js放到缓存中

[[CacheManager defaultManager] storeCachedResponse:cachedResponse forRequest:request])

return;

}

[super storeCachedResponse:cachedResponse forRequest:request];

}

 

自定义的NSURLProtocol子类:


   

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19


   

// 初始化方法

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {

NSString *ua = [request valueForHTTPHeaderField:@"User-Agent"];

if ([CacheManager shouldVerifyHashCode:request] && [ua lf_containsSubString:@"AppleWebKit"]) {

// 拦截js请求

return YES;

}

return NO;

}

// 收到请求返回data的代理方法

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

if([data verifySHA256Success]) {

[self.client URLProtocol:self didLoadData:data];

} else {

localData = [CacheManager bundleCacheFromUrl:url];

[self.client URLProtocol:self didLoadData:localData];

}

}

 

这里不用担心不能更新js文件,因为当后台的 js 文件有更新时,新 js 文件的签名就会发生变化,js 文件的URL也就自然变化,于是本地请求的时候,缓存是无法命中的,所以,也就会直接走下载 js 的那个路径。

缺点如下:
(1).在发生 js 劫持的时候,只能使用本地 js,可能会比最新版本 js 落后
(2).js 文件必须是由自己的服务端提供,并控制,才好对 js 进行签名,所以适用范围略窄
作为这个方案的扩充,可以考虑再次利用NSURLProtocol,当发现 js 被污染,重定向URL,此URL由服务端返回一个加密的 js 文件,对称加密,密钥插入在 js 的密文中,本地解密 js 文件,就可以保证得到最新的,安全的 js 文件了。

总结

本文总结的是HTTP的防劫持,其实现在苹果也建议我们使用HTTPS,是啊,如果大家都使用了HTTPS哪还有这么多事呢,但是苹果框架下的URL Loading System需要我们研究的东西还是比较多的,长路漫漫,Fighting~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP防劫持方案 的相关文章

随机推荐

  • Spark+Python函数总结

    Spark 43 Python函数总结 整理自 https www cnblogs com yangzhang home p 6058076 html https blog csdn net nanruoanhao article deta
  • Spark + Python入门

    Spark 43 Python实践入门 整理自 xff1a https www cnblogs com yangzhang home p 6056133 html http spark apache org docs latest quic
  • Numpy函数总结

    Numpy函数总结 整理自 https www jianshu com p 83c8ef18a1e8 基础属性 引入模块 gt gt gt import numpy as np 创建一个list并转化为numpy数组 创建简单的列表 gt
  • pip提速方法

    Author Gary Date 2019 4 12 方法1 在pip参数中添加镜像源地址 豆瓣 xff1a http pypi douban com simple 清华 xff1a https pypi tuna tsinghua edu
  • 使ssh可以以root用户直接登录

    出于安全考虑 ubuntu默认不允许root远程登录 解决方案 安装openssh软件 sudo apt install y openssh server 编辑 SSH 的文件 sudo nano etc ssh sshd config 将
  • 安装Arduino以及ESP8266开发环境

    安装Arduino以及ESP8266开发环境 Author Gary 更新日期 2018 11 20 1 下载安装ArduinoIDE 没什么好说的 xff0c 下载地址 xff1a https www arduino cc en Main
  • 使用Screen来管理终端

    使用Screen来管理终端 转载整理自 xff1a https blog csdn net u013901768 article details 81189348 需要使程序一直运行的情况下 xff0c 可以采用开机自启动的方式 这里为了便
  • 终端关闭后让程序继续运行

    更新 实测此方法有问题 xff0c ctrl 43 z后进程会停止运行 xff0c 即使挂起了也没用了 xff0c 如需挂起后还能继续执行请参考https blog csdn net m0 37340681 article details
  • HiveDDL

    一 数据类型 1 基本数据类型 Hive数据类型 Java数据类型 长度 例子 TINYINT byte 1byte有符号整数 20 SMALINT short 2byte有符号整数 20 INT int 4byte有符号整数 20 BIG
  • Linux解除端口占用-kill进程总结

    Linux解除端口占用 需要解除端口占用时 xff0c 可以通过端口或者进程名查找进程 xff0c 再通过该进程的pid来杀掉该进程 xff1b 也可以通过进程名直接杀死进程 方法1 根据端口查找进程 sudo lsof i lt 端口号
  • Matplot学习总结

    数据可视化库Matplotlib学习总结 更新日期 20181109 安装 需要先安装numpy pip install numpy pip install matplotlib 如果下载速度慢可以参考 https blog csdn ne
  • 使用GDB调试Android Native层代码

    Author Gary Date 2019 2 21 转载整理自 xff1a https wladimir tm4pda github io porting debugging gdb html https www cnblogs com
  • Shell总结

    Author Gary Date 2019 2 22 转载整理自 xff1a http www runoob com linux linux shell variable html bin bash 是一个约定的标记 xff0c 它告诉系统
  • Android I/O截获

    Author Gary Date 2019 3 15 系统版本 Android 6 0 1 r1 Android I O截获 xff0d xff0d 将Android系统中的汇编系统调用封装为C函数 由于项目要求 xff0c 需要拦截And
  • Android添加内核系统调用

    Author Gary Date 2019 4 30 Android版本 Android 6 0 1 r1 内核版本 Linux 3 10 40 手机 Nexus 6 参考资料 http android blogs rice edu 201
  • Ubuntu Linux 安装 .7z 解压和压缩文件

    转载自 https blog csdn net zqlovlg article details 8033456 安装方法 xff1a sudo apt get install p7zip 解压文件 xff1a 7zr x manager 7
  • SSH设置超时时间

    转载自 https blog csdn net cheng830306 article details 21796865 ssh连接超时问题解决方案 xff1a 1 修改server端的etc ssh sshd config ClientA
  • Win10+RTX2060安装TensorFlow+Keras

    Win10 43 RTX2060安装TensorFlow 43 Keras Author Gary Date 2019 6 8 参考资料 https blog csdn net qq 32728345 article details 815
  • Radix Tree总结

    Date 2019 6 19 主要转载自 https www cnblogs com mingziday p 3969269 html https blog csdn net qq 22613757 article details 9104
  • HTTP防劫持方案

    DNS污染检测 被改标题 被挂黑链 被入侵 检测网站是否被劫持 网站打开速度检测 网站是否被黑 域名是否被墙 网站监控 http www iis7 com b wzjk inviteCode 61 496 HTTP劫持是在使用者与其目的网络