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. Struts2动态方法调用

    动态方法就是一个Action对应多个请求,减少Action的数量 1.指定method属性 <action name="addAction" method="add ...

  2. 第一个shell脚本 结合计划任务下载远程文件

    思路: 进入/usr/local/apache2/htdocs/ipa/  循环读取 /root/shell/wget/down.txt  每次一行,每一行直接就是一条命令,直接 $line 就可以执 ...

  3. Canvas translate- 平移

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

  4. LoadRunner面试题

    在LoadRunner中为什么要设置思考时间和pacing 答: 录制时记录的是客户端和服务端的交互,如果要精确模拟 用户的行为,那么客户操作客户端时花费了很多时间要怎么模拟呢?录入 填写提交的内容, ...

  5. Ubuntu16.04安装GTK3主题:OSX-Arc

    Ubuntu16.04安装GTK3主题:OSX-Arc GTK3主题:OSX-Arc描述: 前几个月,Gnome3.20升3.22的时候,出现了大量主题崩溃的现象,其中包括Arc.Flatabulou ...

  6. ubuntu-14.10下,安装gcc交叉编译器遇到问题及解决方法

    一 下载gcc-arm-none-eabi-4_9 安装成功后上报错误: ./gcc-arm-none-linux-gnueabi-gcc: No such file or directory 网上查 ...

  7. UTF编码检测

    最近工作上正好需要进行UTF编码检测,自己写了一个,分享给大家,希望可以帮得上有需要用的朋友 public bool isUtf8(byte[] rawText) { bool result = tr ...

  8. WebForm 内置对象、数据增删改、状态保持

    一.内置对象 1.Response对象:响应请求 Response.Write("<script>alert('添加成功!')</script>"); → ...

  9. look look C#7

    vs2017也rc好几个版本了,本想跟进看看c#7加入了什么内容,去搜索c#7,确实找到了不少文章,无奈很多特性ide根本不让编译啊...所以今天主要列出已经确定了的c#7特性(一般来说rc后也不会加 ...

  10. 从C#到TypeScript - 接口

    总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...