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的 ...
随机推荐
- chkdsk
通过 Microsoft 的相关帮助就可以明白,例如对D盘进行操作,则: 示例1:chkdsk /? 显示帮助信息. 示例2:chkdsk d: 检查D盘的磁盘状态,报告磁盘错误. 示例3:chkds ...
- Dictionary使用(转)
1.要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib)2.描述 1).从一组键(Key)到一组值(Value)的 ...
- [osgEarth]osgEarth
参考:http://bbs.osgchina.org/forum.php?mod=viewthread&tid=5484&extra=page%3D1&_dsign=70b15 ...
- 用JS的数组缓存一些东西
var cache_index = new Array(); //首页的ajax缓存 //ajax 推荐的游戏和软件 function change_tuijian(sid,div_class){ i ...
- Apache自带压力测试工具ab用法简介
ab命令原理 ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL进行访问.它的测试目标是基于URL的,因此,既可以用来测试Apache的负载压力,也可以测试nginx.lighthttp ...
- Round-Robin负载均衡算法及其实现原理
毫无疑问,随着互联网.移动网络接入成本的降低,互联网正在日益深入地走入我们的生活,越来越成为人们获取信息的高效平台,ICP行业也顺势呈现出强劲的成长趋势,成为互联网迅猛发展形势下最大的受益者,也直接促 ...
- Java泛型类型擦除导致的类型转换问题
初步结论:泛型类型转换不靠谱: 源码: package com.srie.testjava; public class TestClassDefine4<T> { public stati ...
- 【译】延迟加载JavaScript
[译]延迟加载JavaScript 看到一个微信面试题引发的血案 --[译] 什么阻塞了 DOM?中提到的一篇文章,于是决定看下其博客内容,同时翻译下来留作笔记,因英文有限,如有不足之处,欢迎指出.同 ...
- Crontab could not create directory .ssh
最近在利用 crontab 构建自动备份时,遇到了一个问题.我的脚本中包含了用于服务器用户切换使用的 ssh 命令.当我登录到服务器上时,脚本执行正常:当我没有登录到服务器上时,脚本执行失败,错误提示 ...
- 数据挖掘之聚类算法K-Means总结
序 由于项目需要,需要对数据进行处理,故而又要滚回来看看paper,做点小功课,这篇文章只是简单的总结一下基础的Kmeans算法思想以及实现: 正文: 1.基础Kmeans算法. Kmeans算法的属 ...