HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(二)
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实现源码分析(二)的更多相关文章
- HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(一)
// HTTP strict transport security (HSTS) is defined in// http://tools.ietf.org/html/ietf-websec-stri ...
- Nginx-HTTP Strict Transport Security(HSTS)
HTTP Strict Transport Security(HSTS) HTTP Strict Transport Security(通常简称为HSTS)是一个安全功能,它告诉浏览器只能通过HTTP ...
- HTTP Strict Transport Security (HSTS) in ASP.NET Core
本文是<9012年了,还不会Https>的后篇,本文着重聊一聊 HTTP Strict Transport Security协议的概念和应用. 启用HTTPS还不够安全 站点通过HTTPS ...
- vuex源码分析(二) state及strict属性 详解
state也就是vuex里的值,也即是整个vuex的状态,而strict和state的设置有关,如果设置strict为true,那么不能直接修改state里的值,只能通过mutation来设置 例1: ...
- Spring Security(四) —— 核心过滤器源码分析
摘要: 原创出处 https://www.cnkirito.moe/spring-security-4/ 「老徐」欢迎转载,保留摘要,谢谢! 4 过滤器详解 前面的部分,我们关注了Spring Sec ...
- HTTP Strict Transport Security实战详解
HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. 0×01. Freebuf百科: ...
- nginx配置Strict Transport Security
一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入http://zt.test.com或者直接zt.test.com.这样存在中 ...
- HTTP Strict Transport Security (通常简称为HSTS)
HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. Freebuf百科:什么是Str ...
- HTTP Strict Transport Security
HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. 作用 一个网站接受一个HTTP的 ...
随机推荐
- 内网服务器启动报错UNEXPECTED INCONSISTENCY解决方法
一开始进入系统显示reboot and select proper boot device or insert boot media in selected boot device and press ...
- html块级元素和内联元素区别详解
块级元素(block)特性: 总是独占一行,表现为另起一行开始,而且其后的元素也必须另起一行显示; 宽度(width).高度(height).内边距(padding)和外边距(margin)都可控制; ...
- Java语言与C语言之间的应用比较
http://book.51cto.com/art/200906/131809.htm C语言能干的Java也能干的如下: 网络应用层协议服务程序开发:如WebServer.FTPServer.Mai ...
- 【HDU 5808】 Price List Strike Back (整体二分+动态规划)
Price List Strike Back There are nn shops numbered with successive integers from 11 to nn in Bytelan ...
- depcomp: line 571: exec: g++: not found
../depcomp: line 571: exec: g++: not foundmake[1]: *** [my_new.o] Error 127make[1]: Leaving director ...
- C#中IDisposable
在Net中,由GC垃圾回收线程掌握对象资源的释放,程序员无法掌控析构函数的调用时机.对于一些非托管资源,比如数据库链接对象等,需要实现IDisposable接口进行手动的垃圾回收.那么什么时候使用Id ...
- Flex之HTML5视频播放解决方案
Flex的video类对于视频播放在ios操作系统下表现出不兼容,采用调用ios源生播放器的思路,那么怎么调呢? 话说Html5 和Flex是竞争关系,这次利用Html5的video标签实现ios播放 ...
- Spring MVC URL的映射问题 ;Spring MVC 跳转与iframe包含地址问题
/login/login.html 进行form提交,登录之后的页面位于/main/frame.jsp; 这样的controller中的地址需要映射成/main/login.do,然后在control ...
- Struts2标签--S:iterator----jsp页面遍历双层list
双层遍历,第一层list为classes,里面放的是班级class对象,第二层为班级class里的小组groups. <s:iterator value="classes&qu ...
- DEVTMPFS
devtmpfs选项保证了系统启动使用临时文件系统.不选会启动出现readonly ,无法启动