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. UVa 11631 - Dark roads

    题目大意:政府为了减小开支决定关闭一些路灯,同时保证照亮的路能连接所有路口. 又是一个MST问题,Kruskal算法,不过数据规模比较大,又Submission Error了...扔这吧... #in ...

  2. 【Xilinx-Petalinux学习】-07-OpenCV的软硬件处理速度对比

    有空了设计一个hls的图像处理IP. 通过hls设计ip模块实现opencv的图像处理. 对比软件和硬件的图像处理速度.

  3. ios 清除列表选中状态

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

  4. Bootstrap3网上api文档地址

    http://v3.bootcss.com/css/#forms http://www.ziqiangxuetang.com/bootstrap/bootstrap-forms.html 另附加fa字 ...

  5. 采用highchart js+flot+rrd生成cpu、mem状态监控图

    HTML <script type="text/javascript" src="../static/js/jquery-1.8.0.min.js"> ...

  6. JavaWeb学习篇之----HTTP协议详解

    简介: HTTP是hypertexttransfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程. HTTP协 ...

  7. SVG六基本元素

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. linux脚本: 后台启动程序并重定向输出信息脚本

    后台启动程序并重定向输出信息脚本 新建文件mstart, 写入下面代码. #!/bin/bash $1 1>/etc/null 2>&1 & 说明 1>/etc/nu ...

  9. 浅谈Django的Q查询以及AngularJS的Datatables分页插件

    使用Q查询,首先要导入Q模块: from django.db.models import Q 可以组合使用&,|操作符用于多个Q的对象,产生一个新的Q对象,Q对象也可以用~操作符放在前面表示否 ...

  10. 成小胖学习ActiveMQ·基础篇

    过了个春节,回到公司的成小胖变成了成大胖.但是你们千万别以为他那个大肚子里面装的都是肥肉,里面的墨水也多了不少嘞,毕竟成小胖利用春节的半个月时间专心学习并研究了 ActiveMQ,嘿嘿……这不,为了检 ...