HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(一)

下面来查看其他对保存HSTS信息的enabled_sts_hosts_进行操作的函数,对这些函数进行追踪来了解是如何对状态进行管理的。

1.首先发现几个没有调用者的方法

TransportSecurityState::DeleteDynamicDataForHost提供了同时删除HSTS和PKP的机制,但是除单元测试外没有其他地方调用该方法。同样,void TransportSecurityState::ClearDynamicData()也没有找到调用。 TransportSecurityState::DeleteAllDynamicDataSince(const base::Time& time)删除time时间后添加的HSTS和PKP信息(因为比较使用的last_observed),不知有什么作用,同样也没有调用者。

2.

TransportSecurityState::AddOrUpdateEnabledSTSHosts直接根据参数更新了enabled_sts_hosts_,注释说该方法仅用来序列化(serializing/deserializing)ransportSecurityState。查看调用,仅发现了一个调用者TransportSecurityPersister::Deserialize,由此分析流程进入了另一个类TransportSecurityPersister,对应文件transport_security_persister.cc。

3.类TransportSecurityPersister

首先来看头文件优秀的注释:“TransportSecurityState包含了驻内存中的开启hsts的域名列表,这个单例对象(singleton object,注:单例模式Singleton保证一个类仅有一个实例,并提供一个访问它的全局访问点。)处理必要时写入硬盘和启动时的装载。在开始启动时,需要从硬盘中装载HSTS信息,但是目前我们不想由于这个装载而延迟启动,并让TransportSecurityState先运行,这意味着打开非常快的页面可能没有获取到正确的HSTS信息。”这让我们对该类有了一个初步的了解,并且注释还分析了其中潜在的安全隐患,为攻击提供了思路。。

继续上面的分析流程,TransportSecurityPersister::Deserialize方法将JSON格式的字符串参数serialized通过AddOrUpdateEnabledSTSHosts存入参数state的enabled_sts_hosts_中,方法中主要实现了对JSON的解析过程。

LoadEntries调用了Deserialize,并将transport_security_state_清空后传入。LoadEntries被CompleteLoad调用,将字符串参数state传入,并检查dirty来进行更新。CompleteLoad在TransportSecurityPersister的构造函数中被net::Bind,从名字以及传入的是方法地址,猜测应该是注册成了某种回调函数,在必要的时候调用。这个构造函数就两步:第一步使用transport_security_state_->SetDelegate设置代理,回到transport_security_persister.cc可以看到,该方法就是设置成员变量delegate_,这个代理类中只有一个虚方法StateIsDirty,该方法在TransportSecurityPersister中实现,用_writer来更新文件。

第二步用PostTaskAndReplyWithResult,即先调用LoadState,然后将其结果传给TransportSecurityPersister::CompleteLoad,LoadState就是根据参数读取文件并存入result字符串中返回,参数正好与CompleteLoad对应。由此,读取配置文件并导入内存的流程就清楚了。(深入理解可参考有人翻译的chromuim开发文档中文版https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Threading.html,简单的说base::Bind创建了callback类来使用回调;使用base::WeakPtr和base::WeakPtrFactory(在base/memory/weak_ptr.h)以确保任何调用不会超过它们调用的对象的生命周期,而不执行引用计数。base::Bind机制对base::WeakPtr有特殊的理解,会在base::WeakPtr已经失效的情况下终止任务的执行。)

最后总结一下, 对HSTS的处理主要是两个类,Transport_security_state负责内存中信息管理,存储并使用map供查询;TransportSecurityPersister负责永久存储方面的管理,如开始时对配置文件的读取和更新保存。两个类之间通过Delegate委派模式来联系,Transport_security_state使用DirtyNotify来对永久存储发出更新通知。 在类URLRequestHttpJob的Factory方法在创建实例前根据context中存储的Transport_security_state类来判断是否要升级https,解析http头部字段的时候(URLRequestHttpJob::ProcessStrictTransportSecurityHeader)负责添加更新Transport_security_state中的信息。 

By Ascii0x03

转载请注明出处:http://www.cnblogs.com/ascii0x03/p/6375825.html

HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(二)的更多相关文章

  1. HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(一)

    // HTTP strict transport security (HSTS) is defined in// http://tools.ietf.org/html/ietf-websec-stri ...

  2. Nginx-HTTP Strict Transport Security(HSTS)

    HTTP Strict Transport Security(HSTS) HTTP Strict Transport Security(通常简称为HSTS)是一个安全功能,它告诉浏览器只能通过HTTP ...

  3. HTTP Strict Transport Security (HSTS) in ASP.NET Core

    本文是<9012年了,还不会Https>的后篇,本文着重聊一聊 HTTP Strict Transport Security协议的概念和应用. 启用HTTPS还不够安全 站点通过HTTPS ...

  4. vuex源码分析(二) state及strict属性 详解

    state也就是vuex里的值,也即是整个vuex的状态,而strict和state的设置有关,如果设置strict为true,那么不能直接修改state里的值,只能通过mutation来设置 例1: ...

  5. Spring Security(四) —— 核心过滤器源码分析

    摘要: 原创出处 https://www.cnkirito.moe/spring-security-4/ 「老徐」欢迎转载,保留摘要,谢谢! 4 过滤器详解 前面的部分,我们关注了Spring Sec ...

  6. HTTP Strict Transport Security实战详解

    HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. 0×01. Freebuf百科: ...

  7. nginx配置Strict Transport Security

    一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入http://zt.test.com或者直接zt.test.com.这样存在中 ...

  8. HTTP Strict Transport Security (通常简称为HSTS)

    HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. Freebuf百科:什么是Str ...

  9. HTTP Strict Transport Security

    HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. 作用 一个网站接受一个HTTP的 ...

随机推荐

  1. Grid (read-only) objects and methods (client-side reference)获取子表单对象的一些方法 Crm 2016

    https://msdn.microsoft.com/en-us/library/dn932126.aspx#BKMK_GridControl Updated: November 29, 2016 A ...

  2. VS2010中出现无法嵌入互操作类型(转)

    针对word或excel操作时,出现VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法问了度娘,解决方法如出一辙:选中项目中引入的dll,鼠标右键,选择属性,把“嵌入互操作类型”设 ...

  3. gec210 NAND BOOT与SD BOOT启动原理

    CPU上电后,此时SP指针指向0x0000_0000,从这个地址取第一条指令.但此时:PLL没有启动,CPU工作频率为外部输入晶振频率,非常低(S5PV210中晶振在CPU旁边,两颗24MHz,一颗2 ...

  4. redis php sort 函数

    很多人把redis当成一种数据库,其实是利用redis来构造数据库的模型,有那种数据库的味道.但是在怎么构建还是key和value的关系.根真正的关系型数据库还是不一样的.效率高,不方便:方便的,效率 ...

  5. 浅谈Android的Activity运行流程(生命周期)

    关于Android的Activity运行流程,我们可以写一些程序来直观的查看Activity的运行流程.在这里我们使用Log工具来获取Activity运行日志.假如我们新建一个Android项目,Pr ...

  6. Clojure发音

    Clojure的发音和单词closure是一样的.Clojure之父是这样解释Clojure名字来历的 “我想把这就几个元素包含在里面: C (C#), L (Lisp) and J (Java). ...

  7. C++从string中删除所有的某个特定字符

    C++中要从string中删除所有某个特定字符, 可用如下代码 str.erase(std::remove(str.begin(), str.end(), 'a'), str.end()); 其中, ...

  8. ADXL345经验总结,采用SPI和I2C总线操作

    一. ADXL345简介       ADXL345是ADI公司推出的三轴(x,y,z)iMEMS数字加速度计(digital accelerometer),具有在16G下高分辨率(13Bit)测量能 ...

  9. 用php进行md5解密的源码,亲测可用

    <?php $md5 = "c1c95b382230eb9e27a60c4baceb5f2e"; $uid = "hhp-ImZRY"; $token = ...

  10. windows下Visual Studio Code 1.9安装

    点击送你去官网下载vs code 进入下载页面如下 下载完成双击安装 安装完成打开之后如下图,最新版的默认中文就挺好的! 注意下面是微软建议: Note: .NET Framework 4.5.2 i ...