HTTP协议

浏览器背后的故事
- HTTP
超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器
HTTP是一个属于应用层的面向对象的协议,由于其简捷快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展 - Web与HTTP
WEB是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统
建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构
透过TCP/IP看HTTP
- TCP/IP协议族分层
TCP/IP协议族是由一个四层协议组成的系统,这四层分别为: 应用层、传输层、网络层和数据链路层
- 应用层
应用层一般是我们编写的应用程序,决定了向用户提供的应用服务。应用层可以通过系统调用与传输层进行通信。如: FTP、DNS、HTTP等. - 传输层
传输层通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能。
在传输层有两个性质不同的协议:TCP和UDP - 网络层
网络层用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传输给对方。 - 链路层
链路层用来处理连接网络的硬件部分,包括控制操作系统、硬件设备驱动、NIC(Network Interface Card,网络适配器)以及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。
- 传输层-TCP三次握手
第一次握手
客户端发送带有SYN标志的连接请求报文段,然后进入SYN_SEND状态,等待服务端的确认。
第二次握手
服务端接收到客户端的SYN报文段后,需要发送ACK信息对这个SYN报文段进行确认。同时,还要发送自己的SYN请求信息。服务端会将上述的信息放到一个报文段(SYN+ACK报文段中,一并发送给客户端此时服务端将会进入SYN_RECV状态
第三次握手
客户端接收到服务端的SYN+ACK报文段后,会想服务端发送ACK确认报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED状态完成TCP三次握手
回溯HTTP事务处理过程
当客户端访问Web站点时,首先会通过DNS服务查询到域名的IP地址。然后浏览器生成HTTP请求并通过TCP/IP协议发送给Web服务器。Web服务器接收到请求后会根据请求生成响应内容,并通过TCP/IP协议返回给客户端
HTTP协议特点
- 支持客户/ 服务器模式
客户/ 服务器模式工作的方式是由客户端向服务器发出请求服务器端响应请求,并进行相应服务 - 简单快速
- 客户向服务器请求服务时,只需传送请求方法和路径
- 请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同
- 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
- 灵活
- HTTP允许传输任意类型的数据对象
- 正在传输的类型由Content-Type (Content-Type是HTTP包中用来表示内容类型的标识)加以标记
- 无连接
- 无连接的含义是限制每次连接只处理一个请求
- 服务器处理完客户的请求,并收到客户的应答后,即断开连接
- 采用这种方式可以节省传输时间
- 无状态
- HTTP协议是无状态协议
- 无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大
- 另一方面,在服务器不需要先前信息时它的应答就较快
详解URL与URI的区别与联系
- URI: 一个紧凑的字符串用来标示抽象或物理资源
A URI可以进一步被分为定位符、名字或两者都是
术语”Uniform Resource Locator” (URL) 是URI的子集,除了确定一个资源还提供一种定位该资源的主要访问机制(如其网络”位置”)
- URI可以分为URL,URN或同时具备 locators 和 names 特性的一个东西
URN作用就好像一个人的名字,URL就像一个人的地址
换句话说: URN确定了东西的身份,URL提供了找到它的方式
HTTP报文结构分析
- ACCEPT
作用: 浏览器端可以接受的媒体类型
Accept:text/html 代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的html文档,如果服务器无法返回 text/html 类型的数据服务器应该返回一个406错误(Non Acceptable)
Accept:
*/*
代表浏览器可以处理所有类型Accept-Encoding
作用: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法 (gzip,deflate)
- Accept-Language
作用: 浏览器申明自己接收的语言Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3
客户端在服务器有中文版资源的情况下,会请求其返回中文版对应的响应,没有中文版时,则请求返回英文版响应
- Connection
Connection: keep-alive
当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
Connection: close
代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request
,需要重新建立TCP连接
- Host
作用:请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的
- Referer
当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理
- User-Agent
作用:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本
很多情况下我们会通过User-Agnet来判断浏览器类型,从而进行不同的兼容设计
- Content-Type
作用: 说明了报文体内对象的媒体类型
HTTP请求方法剖析
- GET 获取资源
- GET 方法用来请求访问已被URI识别的资源
- 指定的资源经服务器端解析后返回响应内容
- GET 方法也可以用来提交表单和其他数据
- POST
- POST 方法与 GET 功能类似,一般用来传输实体的主体
- POST 方法的主要目的不是获取响应主体的内容
- PUT
- 从客户端向服务器传送的数据取代指定的文档的内容
- PUT 方法与 POST 方法最大的不同是: PUT 是幂等的,而 POST 是不幂等的
- 因此,我们更多时候将PUT方法用作传输资源
- HEAD
类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 - DELETE
请求服务器删除指定的资源 - OPTIONS
用来查询针对请求URI指定的资源支持的方法 - TRACE
回显服务器收到的请求,主要用于测试或诊断 - CONNECT
开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道
HTTP响应状态码拆解
- 状态码:是用以表示网页服务器超文本传输协议响应状态的
3位数字代码
- 200 OK
- 202 Accepted
- 206 Partial Content
- 301 Moved Permanently
- 302 Found
- 400 Bad Request
- 401 Unauthorized
- 403 Forbidden
- 404 Not Found
- 500 Internal Server Error
- 502 Bad Gateway
HTTP状态管理: Cookie与Session
- Cookie
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发一个Cookie。
客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态
- Session
Session是另一种记录客户状态的机制,保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上
客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了
- Cookie与Session
- 存放位置不同
- 安全性(隐私策略)的不同
- 有效期上的不同
- 对服务器压力的不同
HTTP协议之基本认证
- HTTP协议之身份认证
- 身份认证信息
- 密码
- 动态令牌
- 数字证书
- 生物认证
- IC卡等
SSL客户端认证
SSL客户端认证是借由HTTPS的客户端证书完成认证的方式。凭借客户端证书认证, 服务器可确认访问是否来自已登录的客户端基于表单的认证
- 基于表单的认证方法并不是在HTTP协议中定义的
- 使用由Web应用程序各自实现基于表单的认证方式
- 通过Cookie和Session的方式来保持用户的状态
HTTP中长连接与短连接
- HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP请求就结束了
- HTTP的长连接和短连接本质上是TCP长连接和短连接
- HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,结束就中断。
- HTTP/1.1起,默认使用长连接,用以保持连接特性
短连接
建立连接一数据传输一关闭连接..建立连接一数据传输一关闭连接长连接
建立连接数据传输…(保持连接).数据传输关闭连接
HTTP中介之代理
- 对于Web客户端来说,代理扮演的是服务器的角色,接收Request,返回Response
- 对于Web服务器来说,代理扮演的是客户端的角色,发送Request, 接收Response
HTTP中介之网关
- 网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法。网关是资源和应用程序之间的粘合剂。
- 网关扮演的是“协议转换器”的角色。
(HTTP/*)服务器端Web网关
(HTTP/HTTPS)服务器端安全网关
(HTTPS/HTTP)客户端安全加速器网关
资源网关
HTTP内容协商机制
指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言,字符集,编码方式等作为判断的基准
- 客户端驱动
客户端发起请求,服务器发送可选项列表,客户端作出选择后在发送第二次请求 - 服务器驱动
服务器检查客户端的请求头部集并决定提供哪个版本的页面 - 透明协商
某个中间设备(通常是缓存代理)代表客户端进行协商
服务器驱动内容协商-请求首部集
Accept: 告知服务器发送何种媒体类型
Accept-Language: 告知服务器发送何种语言
Accept-Charset: 告知服务器发送何种字符集
Accept-Encoding: 告知服务器采用何种编码
HTTP的断点续传与多线程下载
HTTP 是通过在 Header 里两个参数实现的,客户端发请求时对应的是 Range,服务器端响应时对应的是 Content-Range。
- Content-Range
用于响应头中,在发出带 Range 的请求后,服务器会在 Content-Range 头部返回当前接受的范围和文件总大小。
HTTPS协议概述
- HTTPS 可以认为是
HTTP
+TLS
。 - TLS 是
传输层加密协议
,它的前身是 SSL 协议
HTTPS原理介绍:
内容加密:非对称密钥交换、对称内容加密
HTTP协议的瓶颈
- 一条连接上只可发送一个请求
- 请求只能从客户端开始。客户端不可以接受除响应以外的指令
- 请求/响应头部不经压缩就发送
- 每次互相发送相同的头部造成的浪费较多
- 非强制压缩发送
双工通信的WebScocket
WebSocket的特点:
- 真正的全双工方式
- 减少通信量
探索式的实践-SPDY
SPDY的改进:
- 多路复用请求优化
- 支持服务器推送技术
- SPDY压缩了HTTP头
- 强制使用SSL传输协议
期盼已久的HTTP2
并行双向字节流的请求和响应
- 并行交错地发送请求,请求之间互不影响
- 并行交错地发送响应,响应之间互不干扰
- 只使用一个连接即可并行发送多个请求和响应
- 消除不必要的延迟,减少页面加载的时间
请求优先级
- 高优先级的流都应该优先发送
- 优先级不是绝对的
- 不同优先级混合也是必须的
Web安全攻击概述
Web应用的概念:
- Web 应用是由动态脚本、编译过的代码等组合而成
- 它通常架设在 Web 服务器上,用户在 Web 浏览器上发送请求
- 这些请求使用 HTTP 协议,由 Web 应用和企业后台的数据库及其他动态内容通信
会话管理机制
- 绝大多数Web应用程序中,会话管理机制是一个基本的安全组件
- 会话管理在应用程序执行登录功能时显得特别重要
- 因为,它可在用户通过请求提交他们的证书后,持续向应用程序保证任何特定用户身份的真实性
- 由于会话管理机制所发挥的关键作用,它们成为针对应用程序的恶意攻击的主要目标。
- 若攻击者能够破坏应用程序的会话管理,他就能轻易避开其实施的验证机制,不需用户证书即可伪装成其他应用程序用户。
- 如果攻击者以这种方式攻破一个管理用户,那么他就能够控制整个应用程序。
会话令牌生成漏洞
一些会话令牌通过用户的用户名或电子邮件地址转换而来,或者使用与其相关的其他信息创建
这些信息可以某种方式进行编码或模糊处理,也可与其他数据结合在一起
一些会话令牌并不包含与某个特殊用户有关的任何有意义的数据,但由于它们包含某种顺序或模式,允许攻击者通过几个令牌样本即可推断出应用程序最近发布的其他有效令牌,因此具有可预测性
即使推断过程需要做出大量尝试,并且成功率极低(例如,每1000次尝试得到一个有效令牌),自动攻击工具也仍然能够利用这种缺陷在很短的时间内确定大量有效令牌
生成随机数强度不足
计算机中的数据极少完全随机
因此,如果由于某种原因需要随机数据,一般通过软件使用各种技巧生成伪随机数字
会话终止攻击
尽可能缩短一个会话的寿命可降低攻击者截获、猜测或滥用有效会话令牌的可能性。
一些应用程序并不实施有效的会话终止功能
会话一旦建立,它在收到最后请求后的许多天内也仍然有效,直到服务器最终将其清除。
有些时候,退出功能实际上并不能帮助服务器终止会话
即使服务器从用户的浏览器中删除令牌 (例如,通过发布一个清空令牌的Set-Cookie指令)
然而,如果用户继续提交这个令牌,服务器仍然接受它
最糟糕的情况:当用户单击”退出”按钮时,应用程序并不与服务器通信,因此服务器不采取任何行动
相反,应用程序执行一段客户端脚本清空用户的cookie,在随后的请求中将用户返回到登录页面
访问这个cookie的攻击者就能使用会话,好像用户从未退出一样
会话劫持攻击
- 攻击者通过网络嗅探、XSS攻击等方式获取被攻击者会话令牌的攻击方式。
- 这种攻击方式最简单也最有效,也是目前最多采用的攻击方式
会话管理漏洞的防御
令牌传输安全
令牌只能通过HTTPS传送
如果使用HTTP cookie传送令牌(大多数情况下),应将这些cookie标记为secure,以防止用户浏览器通过HTTP传送它们增加软硬会话过期
软会话过期
,它指的是用户在一定的时间内与应用系统没有交互,则会话过期,也就是我们常说的Session失效硬会话过期
,它指的是用户登录到系统中经过一定的时间后,不管用户做什么,该会话都会过期。提供完善的注销功能
用户可以手动地使当前会话过期,这就是我们在几乎所有网站上都看到的logout按钮
TIPS: 要保证注销不存在会话终止漏洞
SQL注入攻击
SQL注入原理
几乎每一个web应用都需要使用数据库来保存操作所需的各种信息。
所以web程序经常会建立用户提交数据的SQL语句
如果,建立这种语句的方法不安全,那么应用程序就很容易受到SQL注入的攻击。
最严重的情况下,攻击者可利用SQL注入读取甚至修改数据库中保存的所有数据。
用户可以提交一段数据库查询代码,根据程序返回的结果获得某些他想得知的数据。
这就是所谓的SQL Injection,即
SQL注入
。
SQL注入危害
- 探知数据库的具体结构,为进一步攻击做准备
- 泄露数据,尤其是机密信息、账户信息等
- 取得更高权限,来修改表数据甚至是内部结构
SQL注入防御
参数化查询是对SQL注入根本性的防御策略,也叫做预处理语句在建立一个包含用户输入的SQL语句时分为两步:
- 指定查询结构,用户输入预留占位符
- 指定占位符的内容
跨站脚本攻击
跨站脚本攻击(Cross Site Scripting),XSS是一种经常出现在web应用中的计算机安全漏洞
它允许恶意web用户将代码植入到提供给其它用户使用的页面中,其他用户在观看网页时,恶意脚本就会执行。
XSS攻击原理:
- 这类攻击通常通过注入HTML或JS等脚本发动攻击
- 攻击成功后,攻击者可以得到私密网页内容和cookie等
- 最近几年XSS攻击已经成为最流行的攻击方式。
XSS攻击危害:
- 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
- 控制数据,包括读取、篡改、添加、删除企业敏感数据的能力
- 盗窃企业重要的具有商业价值的资料
- 非法转账
- 强制发送网站挂马
- 控制受害者机器向其它网站发起攻击
反射式XSS:
- 也称为非永久性XSS,是目前最流行的XSS攻击
- 它出现在服务器直接使用客户端提交的数据,如url的数据html表单中提交数据等,并且没有对数据进行无害化处理
- 如果提交的数据中含有HTML控制字符而没有被正确处理那么一个简单的XSS攻击就会发生。
- 典型的反射式攻击可通过一个邮件或中间网站,诱饵是个看起来可信任的站点的链接,其中包含XSS攻击脚本
- 如果信任的网站没有正确处理这个脚本,用户点击后就会导致浏览器执行含有恶意攻击的脚本。
存储式XSS:
- 也成为永久性XSS,危害更大
- 攻击将攻击脚本上传到 Web 服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了 Web 服务器的管理员
- 存储式XSS多发生在最终显示给其他用户的位置包含:
- 个人信息字段,如姓名、地址、电子邮件、电话
- 文档、上传文件及其他数据的名称
- 提交给应用程序管理员的反馈或问题
- 向其他应用程序用户传送的消息、注释、问题等
- 在用户之间共享的上传文件内容
基于DOM的XSS攻击:
- 反射式XSS攻击和存储式XSS攻击都是通过服务器端提取用户提交的数据。
- 并且以不安全的方式将其返回给用户
- 基于DOM的攻击仅仅通过JavaScript的方式执行
- 也就是说这种攻击常发生在应用程序每次返回相同的静态html,而通过客户端JavaScript动态生成信息,并不会跟服务端交互获取的时候
XSS攻击载荷:
会话令牌
XSS攻击最普遍的方式
截取一名受害者的会话令牌,劫持他的会话,进而作为受害者的身份来使用应用程序,执行任意操作并占有该用户的账户。虚拟置换
- 这种攻击需要在一个Web应用程序页面注入恶意数据从而向应用程序的用户传送误导性信息。
- 包括简单的向站点注入html,或者使用脚本注入精心设计的内容
- 攻击者实际上没有修改保存在服务器上的内容,而是利用程序处理并显示用户提交的输入方面的缺陷实现置换。
注入木马
- 这种攻击造成的后果远比虚拟置换严重,它在易受攻击的应用程序中注入实际运行的功能,旨在欺骗终端用户执行某种有害操作(如输入敏感数据)
- 随后将它们传送给攻击者。
- 在一个明显的攻击中,攻击者注入的功能向用户显示一个木马登录表单,要求他们向攻击者控制的服务器提交他们自己的证书
- 如果由技巧熟练的攻击者实施,这种攻击还允许用户无缝登录到真正的应用程序中,以便他们不会发觉访问过程中的任何反常情况。
- 然后,攻击者就可以自由使用受害者的证书实现自己的目的
XSS防御措施:
输入验证
如果应用程序在某个位置收到的用户提交的数据将来有可能被复制到它的响应中,应用程序应根据这种情形对这些数据执行尽可能严格的确认。- 数据不是太长
- 数据仅包含某组合法字符
- 数据与一个特殊的正规表达式相匹配
- 根据应用程序希望在每个字段中收到的数据类型,应尽可能限制性地对姓名、电子邮件地址、账号等应用不同的确认规则
输出编码
如果应用程序将某位用户或第三方提交的数据复制到它的响应中,那么应用程序应对这些数据进行HTML编码,以净化可能的恶意字符。
HTML编码指用对应的HTML实体替代字面量字符。这样做可确保浏览器安全处理可能为恶意的字符,把它们当作HTML文档的内容而非结构处理
CSRF攻击
CSRF (Cross-site Request Forgery,跨站请求伪造,也被称为“one click attack” 或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用
CSRF攻击原理:
- XSS利用站点内的信任用户(受害者),而CSRF通过伪装来自受信任用户的请求来利用受信任的网站。
- 通过社会工程学的手段(如通过电子邮件发送一个链接)来蛊感受害者进行一些敏感性的操作,如修改密码、修改E-mail、转账等,而受害者还不知道他已经中招
CSRF攻击危害:
- CSRF的破坏力依赖于受害者的权限
- 如果受害者只是个普通的用户,则一个成功的CSRF 攻击会危害用户的数据以及一些功能
- 如果受害者具有管理员权限,则一个成功的CSRF 攻击甚至会威胁到整个网站的安全