零。前言

这里整理了一下错误和安全相关部分简单记录。

一。HTTP/2错误

1. 错误定义

HTTP/2定义了两种类型错误:

  • 导致整个连接不可使用的错误为连接错误(connection error)
  • 单独出现在单个连接上的错误为流错误(stream error)

2. 错误代码

错误代码,32位正整数表示错误原因,RST_STREAM和GOAWAY帧中包含。

未知或不支持的错误代码可以选择忽略,或作为INTERNAL_ERROR错误对待都可以。

3. 连接错误处理

一般来讲连接错误很严重,会导致处理进程无法进行下去,或影响到整个连接的状态。

  • 终端一旦遇上连接错误,需第一时间在最后一个可用流上发送包含错误原因GOAWAY帧过去,然后关闭连接
  • GOAWAY有可能不被对端成功接收到,若成功接收可获得连接被终止的原因
  • 终端可在任何时间终止连接,也可以把流错误作为连接错误对待。但都应该在关闭连接之前发送一个GOAWAY帧告知对方

4. 流错误

一般来讲具体流上的流错误不会影响到其它流的处理。

  • 终端检测到流错误,需要发送一个RST_STREAM帧,其包含了操作到错误流标识符
  • RST_STREAM应当是发送错误流最后一个帧,内含错误原因。
  • 发送方在发送之后,需要准备接收对端将要或即将发送过来的帧数据,处理方式就是忽略之,除非是可以修改连接状态帧
  • 一般来讲,终端不应该发送多个RST_STREAM帧,但若在一个往返时间之后已关闭的流上能够继续接收帧,则需要发送再次发送一个RST_STREAM帧,处理这种行为不端的实现。
  • 终端在接收到RST_STREAM帧之后,不能响应一个RST_STREAM帧,避免死循环

5. 连接终止

TCP连接被关闭或重置时仍有处于"open"或"half closed"的流将不能自动重试。

二。HTTP/2安全注意事项

1. 跨协议攻击

跨协议攻击,字面上理解就很简单,比如攻击者构建HTTP/1.1请求直接转发给仅仅支持HTTP/2的服务器,以期待获取攻击效果。

这里有一篇讲解跨协议攻击的文章:http://www.freebuf.com/articles/web/19622.html

TLS的加密机制使得攻击者很难获得明文,另外TLS的ALPN协议扩展可以很轻松处理请求是否需要作为HTTP/2请求进行处理,总之可有效阻止对基于TLS的其它协议攻击。

基于标准版TCP没有TLS和ALPN的帮忙,客户端所发送连接序言前缀为PRI字符串用来混淆HTTP/1.1服务器,但对其它协议没有提供保护,仅限于此。但在处理时,若接收到HTTP/1.1的请求,没有包含Upgrade升级字段,则需要认为是一个跨协议攻击。

总之,程序要尽可能的健壮,容错,针对非法的请求,直接关闭对方连接。

2. 中介端数据转换封装的攻击

中介所做的HTTP/1.1和HTTP/2之间转换,会存在攻击点:

  1. HTTP/2头字段名称编码允许使用HTTP/1.1没有使用到的头字段名称,中介在转换HTTP/2到HTTP/1.1时就容易出现包含非法请求头字段HTTP/1.1数据。
  2. HTTP/2允许头字段值可以是非法值,诸如回车(CR, ASCII 0xd), 换行 (LF, ASCII 0xa), 零字符 (NUL, ASCII 0x0),这在逐字解析实现时是一个风险。

解决方式,一旦发现非法头字段名称,以及非法头字段值,都作为不完整、残缺数据对待,或丢弃,或忽略。

3. 推送内容的缓存

推送内容有保证的服务器提供,是否缓存由头字段Cache-Control控制。

但若服务器上多租户形式(SAAS),每一个租户使用一小部分URL空间,比如 tenant1.domain.com,tenant2.domain.com,服务器需要确保没有授权的租户不能够推送超于预期的资源,覆盖已有内容。

原始服务器没有被授权使用推送,既不能够违规发送推送,也不能够被缓存。

4. 拒绝服务攻击注意事项

  • HTTP/2因为要为流、报头压缩、流量控制等特性占用资源较多,因此针对每一个连接的内存分配要设置限额,否则很少的连接占满内存,无法正常服务
  • 针对单个连接,规范对PUSH_PROMISE帧数量没有约束,但客户端需要设置一个上限值,这也是确定需要维护的"reserved (remote)"状态的数量,超出限额需要报ENHANCE_YOUR_CALM类型流错误
  • SETTINGS帧有可能会被滥用导致对端需要花费时间解析处理设置限制等,滥用情况包括包含未定义的参数,以及同一个参数多次出现等,类似于WINDOW_UPDATE和PRIORITY帧都会存在滥用的情况;这些帧被滥用导致资源耗费情况严重
  • 大量小帧或空帧一样会被滥用,但又符合逻辑,耗费服务器资源在处理报文头部上面。比如空负载DATA帧,以及用于携带报文头部数据的CONTINUATION帧,都属于安全隐患
  • 报头压缩存在潜在风险,也会被滥用,详情可参考HPACK协议第七章:http://http2.github.io/http2-spec/compression.html#Security
  • 终端中途发送的SETTINGS帧所定义参数不是立即可以生效的,这会导致对端在实际操作时可能会超过最新的限制。建议直接在连接建立时在连接序言内包含设置值,就算如此,客户端也会存在超出服务器端连接序言中所设置的最新限定值。

总之,诸如SETTINGS帧、小帧或空帧,报头压缩被合理滥用时,表明上看符合逻辑,会造成资源过度消耗。这需要服务器端监控跟踪到此种行为,并且设置使用数量的上限,一旦发现直接报ENHANCE_YOUR_CALM类型连接错误。

5. 报头块大小限制

报头块过大导致实现需要维护大量的状态开销。另外,根据报头字段进行路由的情况,若此报头字段出现在一系列报头块帧的最后一个帧里面,可能会导致无法正常路由到目的地。若被缓存会导致耗费大量的内存。这需要设置SETTINGS_MAX_HEADER_LIST_SIZE参数限制报头最大值,以尽可能的避免出现以上情况。

服务器一旦接收到超过报头限制请求,需要响应一个431(请求头过大) HTTP状态码,客户端呢可直接丢掉响应。

6. 压缩使用的安全隐患

  • 针对安全通道,不能使用同一个压缩字典压缩保密的关键数据和易受攻击者控制的数据
  • 来源数据不能确定为完全可靠,就不应该使用压缩机制
  • 通用流的压缩不能在基于TLS的HTTP/2上使用这一部分,可参考 http://http2.github.io/http2-spec/compression.html#Security

7. 填充使用的安全隐患

一般来讲,填充可用来混淆帧的真实负载长度,稍加保护,降低攻击的可能性。但若不当的填充策略:固定填充数、可轻松推导出填充规则等情况都会降低保护的力度,都有可能会被攻击者破解。

中介设备应该保留DATA帧的填充(需要避免如上所述一些情况),但可丢弃HEADERS和PUSH_PROMISE帧的填充。

三。TLS

HTTP/2加密建立在TLS基础,关于TLS,维基百科上有解释:http://zh.wikipedia.org/wiki/%E5%82%B3%E8%BC%B8%E5%B1%A4%E5%AE%89%E5%85%A8%E5%8D%94%E8%AD%B0

摘取一张图,可说明基于ALPN协议扩展定义的协商流程:

其它要求:

  • 只能基于TLS >= 1.2版本。目前TLS 1.3为草案版本,正式版本目前尚未可知。目前只有TLS 1.2可选。
  • 必须支持Server Name Indication (SNI) [TLS-EXT]扩展,客户端在连接协商阶段需要携带上域名
  • 基于TLS 1.3或更高版本构建,仅需要支持SNI扩展。TLS 1.2要求较多
  • 基于TLS 1.2构建
    • 必须禁用压缩机制。不恰当压缩机制会导致信息外露,HTTP/2报头有压缩机制
    • 必须禁用重新协商机制。终端对待TLS 1.2重新协商作为PROTOCOL_ERROR类型连接错误对待;密码套件加密次数限制导致连接一直挂起等待不可用
    • 终端可以通过重新协商提供对客户端凭证保护功能在握手期间,重新协商必须发生在发送连接序言之前进行。服务器当看到重新协商请求时应该请求客户端证书在连接建立后
    • 当客户端请求受保护的特定资源时,服务器可以响应HTTP_1_1_REQUIRED错误,可有效阻止重新协商机制

四。小结

这里简单记录HTTP/2错误和安全相关事项,本系列规范学习到此告一段落。

原文 http://www.blogjava.net/yongboy/archive/2015/03/24/423791.html

转载于:https://www.cnblogs.com/yudar/p/4642611.html

HTTP/2笔记之错误处理和安全相关推荐

  1. 学习SpringBoot笔记以及错误记录

    学习SpringBoot笔记以及错误记录 <1>. 启动类(SpringBootApplication)放错位置 错误场景:MainApplication类不应放在默认的src.main. ...

  2. 学习笔记:Keras 错误提示

    目录: 目录: Keras使用陷阱 TF卷积核与TH卷积核 向BN层中载入权重 Keras的可训练参数在前,不可训练参数在后 Merge层的层对象与函数方法 本系列参考官方文档官方文档 这就是kera ...

  3. PHP笔记-所有错误统一输出404页面(详细错误日志输出,提高安全性)

    这里我用的是自定义MVC,所以统一错误页面很简单,自定义MVC框架在这篇博文 PHP笔记-自定义MVC框架_IT1995的博客-CSDN博客 当输入任意不存在的页面时: 这里在 private sta ...

  4. 我的笔记---编译错误原因及其他一些总结

    我的笔记 转载,归纳得很好 从vc6升级到vc8的一些问题及解决方法(部分体验) 从vc6升级到vc7的一些问题及解决方法 最近由于工作需要,把项目从vc6升级到vc8(vc005).升级过程遇到些问 ...

  5. 【廖雪峰Python学习笔记】错误、调试、测试

    文章目录 错误处理 调试 单元测试unitcase 文档测试 错误类型 程序编写问题bug – 字符类型错误等 用户输入错误 – 输入不符合规定的字符串 异常,程序运行时无法预测 – 磁盘满了,无法写 ...

  6. sybase笔记 2762错误

    因存储过程有临时表,在调用的时候出现2762错误,完整的错误代码如下: 2762 [errmsg]:The 'CREATE TABLE' command is not allowed within a ...

  7. Python入门笔记(17):错误、异常

    一.什么是错误,什么是异常,它们两者区别 这里解释如下:个人觉得很通俗易懂 错误是指在执行代码过程中发生的事件,它中断或干扰代码的正常流程并创建异常对象.当错误中断流程时,该程序将尝试寻找异常处理程序 ...

  8. Python学习笔记:错误和异常

    本文来自:入门指南 开胃菜参考:开胃菜 使用Python解释器:使用Python解释器 本文对Python的简介:Python简介 Python流程介绍:深入Python流程 Python数据结构:P ...

  9. Pytho学习笔记:错误,测试,调试(合)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  10. Python学习笔记:错误,测试,调试(转)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. 递归的妙用—遍历子控件
  2. BigData/Cloud Computing:购买并登录Windows弹性云服务器之详细攻略(图文教程)—更优惠、更贴心!
  3. Cambridge Judge Business school faculty review
  4. boost::astar_search用法的测试程序
  5. 开源项目|从0到1教你搭建一个适配于智能车的目标检测系统
  6. ASP.NET MVC 5 学习教程:控制器传递数据给视图
  7. 处理效应模型stata实例_stata︱政策处理效应模型sata基本命令汇总
  8. iOS 8 Metal Swift教程 :开始学习
  9. .NET设计模式(1):1.1 单例模式(Singleton Pattern)
  10. ruby mysql dbi_Ruby/DBI-数据库访问接口
  11. Linux上SQL Server合并复制
  12. Android MediaPlayer的生命周期
  13. Mac安装jdk17和jdk18
  14. CCNA交换技术综合实验步骤详解
  15. matlab程序产生OAM波,一种反射型极化转换超表面的轨道角动量产生结构设计的制作方法...
  16. 图片转字符画-----做出酷炫的头像
  17. Python爬虫-豆瓣电影排行榜TOP250
  18. 2000坐标系xy坐标几位_详解| 带你认识新一代坐标系——2000国家大地坐标系
  19. 在阿里云OSS,如何更好搭建自己的云储存
  20. git学习笔记[idea整合GitHub,Gitee](非常详细)

热门文章

  1. win10下安装Prodave6.2
  2. 基于 CPU 实施高效且快速的医疗影像分析
  3. mysql int 11 最大多少_types - mysql中int(11)列的大小(以字节为单位)是多少?...
  4. 查看san交换机端口流量_MRTG监测交换机端口流量图解(图文)
  5. php cms 源码小说,PHPMAOS 强大的小说CMS系统
  6. Unity 项目中资源管理(续)
  7. vue综合项目--悦听播放器
  8. Vista下的支付宝安全控件
  9. AVR MEGA16A USART ADC PWM IO读取,双色点阵,1602,五向摇杆等综合性代码,初学者慎入。
  10. android开发笔记之mk文件