web应用安全与加速课程讲义.docx
《web应用安全与加速课程讲义.docx》由会员分享,可在线阅读,更多相关《web应用安全与加速课程讲义.docx(292页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、Web应用安全与加速讲义1 HTTP1.1 HTTP报文HTTP 报文是在 HTTP 应用程序之间发送的数据块( 用于 HTTP 协议交互的信息)。请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应报文。1.1.0 Debug模式下的HTTP事务URL:Remote Address:访问目标URL解析出来的IP地址,443:表示当前https协议。Referrer Policy : Referrer用户指明当前请求的来源页面,对于同源的请求,会发送完整的url作为引用地址,防盗链。accept:请求可以支持的响应格式列表信息accept-encoding:告知服务器本
2、地浏览器支持是压缩方式sec-fetch-dest:期望获得什么类型的资源sec-fetch-mode :navigate,表示这是一个浏览器的页面切换请求sec-fetch-site:表示一个请求发起的来源和目标资源来源之间的关系,cross- site:跨域请求,same-origin:同源请求。sec-fetch-user:?1表示的trueupgrade-insecure-requests :1,表示当前浏览器告诉服务器,浏览器是可以处理https请求的,即使访问的https请求中又包含了其他的http请求。user-agent:描述浏览器的信息server :web应用程序部署的容器
3、,openresty:封装了Nginx以及第三方的类库,Lua语言,redis等等。vary :accept-Encoding,告诉代理服务器缓存两种版本的资源(压缩、不压缩)1.1.1 报文流动HTTP 使用术语流入(inbound) 和流出(outbound) 来描述事务处理(transaction)的方向。 报文流入源端服务器, 工作完成之后, 会流回用户的 Agent 代理中报文流入源端服务器并流回到客户端1.1.2 报文的组成部分HTTP 报文是简单的格式化数据块。 每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应。 它们由三个部分组成:1. 对报文进行描述的起始行(st
4、art line)2. 包含属性的首部(header)块3. 以及可选的包含数据的主体(body) 部分(1) 所有的 HTTP 报文都可以分为两类: 请求报文(request message) 和响应报文(response message)。 请求报文会向 Web 服务器请求一个动作。响应报文会将请求的结果返回给客户端。 请求和响应报文的基本报文结构相同。这是请求报文的格式:这是响应报文的格式(注意, 只有起始行的语法有所不同) :(2) 请求报文(3) 响应报文(4) HTTP消息由采用ASCII编码的多行文本构成。在HTTP/1.1及早期版本中,这些消息通过连接公开地发送。在HTTP/2
5、中,为了优化和性能方面的改进,曾经可人工阅读的消息被分到多个HTTP帧中。Web 开发人员或网站管理员,很少自己手工创建这些原始的HTTP消息 由软件、浏览器、 代理或服务器完成。他们通过配置文件(用于代理服务器或服务器),API (用于浏览器)或其他接口提供HTTP消息。(5) HTTP 请求和响应具有相似的结构,由以下部分组成1. 一行起始行用于描述要执行的请求,或者是对应的状态,成功或失败,这个起始行总是单行的。2. 一个可选的HTTP头集合指明请求或描述消息正文。3. 一个空行指示所有关于请求的元数据已经发送完毕。4. 一个可选的包含请求相关数据的正文 (比如HTML表单内容),或者响
6、应相关的文档。 正文的大小有起始行的HTTP头来指定。起始行和 HTTP 消息中的HTTP 头统称为请求头,而其有效负载被称为消息正文。1.1.3 HTTP请求(1) 起始行HTTP请求是由客户端发出的消息,用来使服务器执行动作。起始行 (start-line)包含三个元素:PUTHEADGET1. 一个 HTTP 方法,一个动词 ( GET ,或者 POST ) 或者一个名词 (像或者 OPTIONS ), 描述要执行的动作. 例如,示向服务器推送数据 (创建或修改资源)。表示要获取资源, POST 表2. 请求目标 (request target),通常是一个URL,或者是协议、端口和域名
7、的绝对路径,通常以请求的环境为特征。请求的格式因不同的 HTTP 方法而异。它可以是:GET一个完整的URL,被称为 绝对形式 (absolute form),主要在使用方法连接到代理时使用。GET http:/developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1由域名和可选端口(以: 为前缀)组成的 URL 的 authorityCONNECTcomponent,称为 authority form。 仅在使用道时才使用。建立 HTTP 隧CONNECT developer.mozilla.org:80 HTTP/1.1OPTI
8、ONS * HTTP/1.1OPTIONS星号形式 (asterisk form),一个简单的星号( * ),配合方法使用,代表整个服务器。3. HTTP 版本 (HTTP version),定义了剩余报文的结构,作为对期望的响应版本的指示符。(2) Headers(:)来自请求的 HTTP headers遵循和 HTTP header 相同的基本结构:不区分大小写的字符串,紧跟着的冒号和一个结构取决于 header 的值。 整个header(包括值)由一行组成,这一行可以相当长。(3) Body请求的最后一部分是它的 body。不是所有的请求都有一个 body:例如获取资源的请求,GET,H
9、EAD,DELETE 和 OPTIONS,通常它们不需要 body。 有些请求将数据发送到服务器以便更新数据:常见的的情况是 POST 请求(包含 HTML 表单数据)。1.1.4 HTTP响应(1) 状态行HTTP 响应的起始行被称作 状态行 (status line),包含以下信息:HTTP/1.1。1. 协议版本,通常为2. 状态码 (status code),表明请求是成功或失败。常见的状态码是 200 ,404 ,或 302 。3. 状态文本 (status text)。一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。一个典型的状态行看起来像这样: HT
10、TP/1.1 404 Not Found 。(2) Headers响应的 HTTP headers:不区分大小写的字符串,紧跟着的冒号 ( : ) 和一个结构取决于 header 类型的值。 整个 header(包括其值)表现为单行形式。(3) Body响应的最后一部分是 body。不是所有的响应都有 body。1.1.5 HTTP请求方法请求的起始行以方法作为开始, 方法用来告知服务器要做些什么。(1) GETGET 是最常用的方法。 通常用于请求服务器发送某个资源。 HTTP/1.1 要求服务器实现此方法。(2) HEADHEAD 方法与 GET 方法的行为很类似, 但服务器在响应中只返回
11、首部。 不会返回实体的主体部分。 这就允许客户端在未获取实际资源的情况下, 对资源的首部进行检查。 使用 HEAD, 可以: 在不获取资源的情况下了解资源的情况(比如, 判断其类型) ; 通过查看响应中的状态码, 看看某个对象是否存在; 通过查看首部, 测试资源是否被修改了。服务器开发者必须确保返回的首部与 GET 请求所返回的首部完全相同。 遵循HTTP/1.1 规范, 就必须实现 HEAD 方法。(3) PUT与 GET 从服务器读取文档相反, PUT 方法会向服务器写入(更新)文档。PUT 方法的语义就是让服务器用请求的主体部分来创建一个由所请求的 URL 命名的新文档, 或者, 如果那
12、个 URL 已经存在的话, 就用这个主体来替代它。(4) POSTPOST 方法起初是用来向服务器输入数据的 。 实际上, 通常会用它来支持HTML的表单。 表单中填好的数据通常会被送给服务器处理。(5) TRACETRACE客户端发起一个请求时, 这个请求可能要穿过防火墙、 代理、 网关或其他一些应用程序。 每个中间节点都可能会修改原始的 HTTP 请求。 TRACE 方法允许客户端在最终将请求发送给服务器时, 看看它变成了什么样子。TRACE 请求会在目的服务器端发起一个“环回” 诊断。 行程最后一站的服务器会弹回一条 TRACE 响应, 并在响应主体中携带它收到的原始请求报文。 这样客户
13、端就可以查看在所有中间 HTTP 应用程序组成的请求 / 响应链上, 原始报文是否, 以及如何被毁坏或修改过TRACE 方法主要用于诊断; 也就是说, 用于验证请求是否如愿穿过了请求 / 响应链。(6) OPTIONSOPTIONS 方法请求 Web 服务器告知其支持的各种功能。 可以询问服务器通常支持哪些方法, 或者对某些特殊资源支持哪些方法。(7) DELETEDELETE 方法所做的事情就是请服务器删除请求 URL 所指定的资源。1.1.6 状态码方法是用来告诉服务器做什么事情的, 状态码则用来告诉客户端,事情执行的结果。状态码位于响应的起始行中。 服务器通常会返回一个数字状态和一个可读
14、的状态。 数字码便于程序进行差错处理, 而原因短语则更便于人们理解。200 到 299 之间的状态码表示成功。300 到 399 之间的代码表示资源已经被移走400 到 499 之间的代码表示客户端的请求出错500 到 599 之间的代码表示服务器出错状态码分类:常见状态码:(1) 成功状态码客户端发起请求时, 这些请求通常都是成功的。 服务器有一组用来表示成功的状态码, 分别对应于不同类型的请求。(2) 重定向状态码重定向状态码要么告知客户端使用替代位置来访问他们所感兴趣的资源, 要么就提供一个替代的响应而不是资源的内容。如果资源已被移动, 可发送一个重定向状态码告知客户端资源已被移走, 以
15、及现在可以在哪里找到目标资源。使用场景:web应用支持https,客户端访问,服务器收到请求之后(Nginx)发现请求的是http请求,可以返回301告知浏览器重新发出请求。重定向状态码与原因短语:301 redirect: 301 代表永久性转移(Permanently Moved)302 redirect: 302 代表暂时性转移(Temporarily Moved )301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)这是它们的共
16、同点。他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。(3) 客户端错误状态码有时客户端会发送一些服务器无法处理的东西, 比如格式错误的请求报文, 或者最常见的是, 请求一个不存在的 URL。浏览网页时, 我们都看到过臭名昭著的 404 Not Found 错误码这只是服务器在告诉我们, 它对我们请求的资源一无所知。状态码原因短语含义400 Bad Request用千告知客
17、户端它发送了一个错误的请求401 Unauthorized与适当的首部一同返回,在这些首部中请求客户端在获取对资源的访问权之前,对自已进行认证。更多有关认证的内容请参见12.1节402 Payment Required现在这个状态码还未使用,但已经被保留,以作未来之用403 Forbidden用千说明请求披服务器拒绝了。如果服务器想说明为什么拒绝请求,可以包含实体的主体部分来对原因进行描述。但这个状态码通常是在股务器不想说明拒绝原因的时候使用的404 Not Found用千说明股务器无法找到所请求的URL。通常会包含一个实体,以便客户端应用程序显示给用户看405 Method Not Allo
18、wed发起的请求中带有所请求的URL不支持的方法时,使用此状态码。应该在响应中包含Allow首部,以告知客户端对所请求的资源可以使用哪些方法。更多有关Allow首部的信息请参见3.5.4节406 Not Acceptable客户端可以指定参数来说明它们愿意接收什么类型的实体。服务器没有与客户端可接受的URL相匹配的资源时,使用此代码。通常,股务器会包含一些首部,以便客户端弄清楚为什么请求无法满足。更多信息请参见第17407 Proxy Authentication与401状态码类似,但用千要求对资源进行认证的代理服务器Required408 Request Timeout如果客户端完成请求所花
19、的时间太长,服务器可以回送此状态码,井关闭连接。超时时长随服务器的不同有所不同,但通常对所有的合法请求来说,都是够长的409 Conflict用千说明请求可能在资源上引发的一些冲突。服务器担心请求会引发冲突时,可以发送此状态码。响应中应该包含描述冲突的主体(4) 服务器错误状态码有时客户端发送了一条有效请求, 服务器自身却出错了。 这可能是客户端碰上了服务器的缺陷, 或者服务器上的子元素, 比如某个网关资源, 出了错。代理尝试着代表客户端与服务器进行交流时, 经常会出现问题。1.2 连接管理1.2.1 TCP连接HTTP 通信由 TCP/IP 承载的, TCP/IP 是全球计算机及网络设备都在
20、使用的一种常用的分组交换网络分层协议集。 客户端应用程序可以打开一条 TCP/IP 连接,连接到可能运行在世界任何地方的服务器应用程序。 一旦连接建立, 在客户端和服务器的计算机之间交换的报文就永远不会丢失、 受损或失序。1.2.1.1 三步握手TCP协议目的是为了保证数据能在两端准确连续的流动,可以想象两个建立起 TCP通道的设备就如同接起了一根水管,数据就是水管中的水由一头流向另一头。然而TCP为了能让一个设备连接多根“水管”,让一个设备能同时与多个设备交互信息,它必须要保证不同水管之间不会产生串联或相互影响为了确保数据能够正确分发,TCP用一种叫做TCB,也叫传输控制块的数据结构把发给不
21、同设备的数据封装起来,我们可以把该结构看做是信封。一个TCB数据块包含了数据发送双方对应的socket信息以及拥有装载数据的缓冲区。在两个设备要建立连接发送数据之前,双方都必须要做一些准备工作,分配内存建立起TCB数据块就是连接建立前必须要做的准备工作。(0) 准备工作最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态(1) 一次握手:TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SY
22、N=1,同时选择一个初始序列号 seq=x 。此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。(2) 二次握手:TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。ACK为1表示确认号有效,为0表示报文中不包含确认信息(3) 三次握手:TCP客户进程收到确认后,还要向服务
23、器给出确认。确认报文的ACK=1, ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入 ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。当服务器收到客户端的确认后也进入established状态,此后双方就可以开始通信了。注:tcp建立连接需要三次握手,SYN是发送标志位,ACK是确认标志位.为什么TCP客户端最后还要发送一次确认呢?主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- web 应用 安全 加速 课程 讲义
限制150内