Loading

web 安全之页面解析的流程学习

0x00 任务内容:

  1. 理解域名解析的整个过程
  2. 理解 web 页面请求的整个流程,绘制流程图(nginx 处理的 11 个过程)
  3. 学习 http 协议中的字段及含义
  4. 学习 http 请求方法以及返回状态码的类型和含义

扩展学习:思考这个过程中都会涉及哪些安全问题,常规的网站架构(waf、cdn 等设备部署在什么地方)

0x01 学习内容

1. 域名解析的整个过程

a. 名词解释

域名网域名称(英语:Domain Name,简称:Domain),简称域名网域,是由一串用点分隔的字符组成的互联网上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。域名可以说是一个IP地址的代称,目的是为了便于记忆后者。例如,wikipedia.org是一个域名,和IP地址208.80.152.2相对应。人们可以直接访问wikipedia.org来代替IP地址,然后域名系统(DNS)就会将它转化成便于机器识别的IP地址。这样,人们只需要记忆wikipedia.org这一串带有特殊含义的字符,而不需要记忆没有含义的数字。

DNS域名系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。

域名解析:举一个例子,zh.wikipedia.org 作为一个域名就和IP地址198.35.26.96 相对应。DNS就像是一个自动的电话号码簿,我们可以直接拨打198.35.26.96 的名字zh.wikipedia.org 来代替电话号码(IP地址)。DNS在我们直接调用网站的名字以后就会将像zh.wikipedia.org 一样便于人类使用的名字转化成像198.35.26.96 一样便于机器识别的IP地址。

DNS查询有两种方式:递归迭代。DNS客户端设置使用的DNS服务器一般都是递归服务器,它负责全权处理客户端的DNS查询请求,直到返回最终结果。而DNS服务器之间一般采用迭代查询方式。

b. 流程介绍

  1. 浏览器输入域名之后,首先会检查浏览器缓存中是否缓存过该域名对应的IP地址

    用户通过浏览器浏览过某网站之后,浏览器就会自动缓存该网站域名对应的地址,当用户再次访问的时候,浏览器就会从缓存中查找该域名对应的IP地址,因为缓存不仅是有大小限制,而且还有时间限制(域名被缓存的时间通过属性来设置),所以存在域名对应的找不到的情况。当浏览器从缓存中找到了该网站域名对应的地址,那么整个解析过程结束,如果没有找到,将进行下一步骤。对于的缓存时间问题,不宜设置太长的缓存时间,时间太长,如果域名对应的发生变化,那么用户将在一段时间内无法正常访问到网站,如果太短,那么又造成频繁解析域名。

  2. 如果在浏览器缓存中没有找到IP,那么将继续查找本机系统是否缓存过IP

    如果第一个步骤没有完成对域名的解析过程,那么浏览器会去系统缓存中查找系统是否缓存过这个域名对应的地址。其实操作系统也有一个域名解析的过程,通过hosts文件设置,用户可以将任何域名解析到任何能够访问的IP地址。正是因为有这种本地DNS解析的规程,所以有黑客就可能通过修改用户的域名来把特定的域名解析到他指定的IP地址上,导致这些域名被劫持。

  3. 向本地域名解析服务系统发起域名解析的请求

    以上两步的解析是在本机上完成的,如果本机无法解析域名,那么系统只能请求本地域名解析服务系统进行解析,本地域名系统一般都是本地区的域名服务器,比如你连接的校园网,那么域名解析系统就在你的校园机房里,如果你连接的是电信、移动或者联通的网络,那么本地域名解析服务器就在本地区,由各自的运营商来提供服务。对于本地域名解析服务器,一般都缓存了地区内部域名解析请求的结果,如果缓存命中则返回相应的结果,当然缓存时间也受域名失效时间控制。大约80%的域名解析到这里就结束了,所以本地域名解析系统主要承担了域名的解析工作。

  4. 向根域名解析服务器发起域名解析请求

    如果本地域名解析系统的缓存中没有所需要查找到域名,则将会向根域名服务器发起解析请求。

  5. 根域名服务器返回给本地域名服务器一个所查询的主域名服务器(gTLD Server)地址

    根域名是不负责解析域名的,它只负责管理所有的顶级域名。比如:你要解析的网址是:www.xxx.com,根域名服务器是不知道这个域名的IP地址的,但是它知道这个IP在它管理的.com域名下,根域名服务器会向请求方发送.com域名服务器的地址,引导请求方继续查询。

  6. 本地域名服务器LDNS再向上一步返回的gTLD服务器发送请求

    因为域名服务器之间会有大量的数据需要处理,所以DNS服务器之间一般采用迭代查询方式。本地域名解析服务器向gTLD服务器发起请求。

  7. gTLD服务器接收请求并返回Name Server服务器

    指定的域名由指定的Name Server服务器进行解析。

  8. Name Server服务器返回IP地址给本地服务器

    服务器查找域名对应的地址,将地址连同值返回给本地域名服务器。

  9. 本地域名服务器缓存解析结果

    本地域名服务器缓存解析后的结果,缓存时间由TTL值控制。

  10. 返回解析结果给用户

    解析结果将直接返回给用户,用户系统将缓存该地址,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。

c. 域名解析记录

  • A (Address) 记录:又称IP指向,用户可以在此设置⼦域名并指向到⾃⼰的⽬标主机地址上,从
    而实现通过域名找到服务器。
  • CNAME记录:也被称为规范名字。这种记录允许您将多个名字映射到同⼀台计算机。
  • MX(Mail Exchanger)记录:邮件交换记录,它指向⼀个邮件服务器,⽤于电⼦邮件系统发邮
    件时根据 收信⼈的地址后缀来定位邮件服务器。
  • NS(Name Server)记录:解析服务器记录。⽤来表明由哪台服务器对该域名进⾏解析。这⾥的NS
    记录只对⼦域名⽣效。
  • TXT记录:⼀般指为某个主机名或域名设置的说明。

d. 递归与迭代

递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机。

img

迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询。

img

2. Web 页面请求流程

a. Web中间件

Nginx

Nginx 性能稳定、功能丰富、运维简单、处理静态文件速度快且消耗系统资源极少。
1、相比 Apache,用 Nginx 作为 Web 服务器:使用资源更少,支持更多并发连接,效率更高。
2、作为负载均衡服务器:Nginx 既可在内部直接支持 Rails 和 PHP,也可支持作为 HTTP 代理服务器对外进行服务。Nginx 用 C 编写而成, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
3、作为邮件代理服务器:Nginx 同时也是一款非常优秀的邮件代理服务器(最早开发这个产品的目的之一,是作为邮件代理服务器)。

4、反向代理可以根据url将请求转向于不同用途的集群,比如图片请求,转向图片服务器集群;视频请求,转身视频服务器集群。

nginx是一款轻量级的web服务器/反向代理服务器/电子邮件代理服务器,安装非常简单,配置文件也很简洁(还支持 perl 语法)。Nginx 支持平滑加载新配置,还能够在不间断服务的情况下进行软件版本升级。

代理

在Java设计模式中,代理模式是这样定义的:给某个对象提供一个代理对象,并由代理对象控制原对象的引用。

可能大家不太明白这句话,在举一个现实生活中的例子:比如我们要买一间二手房,虽然我们可以自己去找房源,但是这太花费时间精力了,而且房屋质量检测以及房屋过户等一系列手续也都得我们去办,再说现在这个社会,等我们找到房源,说不定房子都已经涨价了,那么怎么办呢?最简单快捷的方法就是找二手房中介公司(为什么?别人那里房源多啊),于是我们就委托中介公司来给我找合适的房子,以及后续的质量检测过户等操作,我们只需要选好自己想要的房子,然后交钱就行了。

代理简单来说,就是如果我们想做什么,但又不想直接去做,那么这时候就找另外一个人帮我们去做。那么这个例子里面的中介公司就是给我们做代理服务的,我们委托中介公司帮我们找房子。

正向代理

弄清楚什么是代理了,那么什么又是正向代理呢?

这里我再举一个例子:大家都知道,现在国内是访问不了 Google的,那么怎么才能访问 Google呢?我们又想,美国人不是能访问 Google吗(这不废话,Google就是美国的),如果我们电脑的对外公网 IP 地址能变成美国的 IP 地址,那不就可以访问 Google了。你很聪明,VPN 就是这样产生的。我们在访问 Google 时,先连上 VPN 服务器将我们的 IP 地址变成美国的 IP 地址,然后就可以顺利的访问了。

这里的 VPN 就是做正向代理的。正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。这里客户端是要进行一些正向代理的设置的。

反向代理

反向代理和正向代理的区别就是:正向代理代理客户端,反向代理代理服务器。

反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

下面我们通过两张图来对比正向代理和方向代理:

nginx2

nginx3

理解这两种代理的关键在于代理服务器所代理的对象是什么,正向代理代理的是客户端,我们需要在客户端进行一些代理的设置。而反向代理代理的是服务器,作为客户端的我们是无法感知到服务器的真实存在的。

IIS

IISInternet Information Services的缩写,意为互联网信息服务,是由微软公司提供的基于 运行Microsoft Windows的互联网基本服务。 最初是Windows NT版本的可选包,随后内置在Windows 2000、Windows XP ProfessionalWindows Server 2003一起发行,但在Windows XP Home版本上并没有IISIIS是一种Web(网页)服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器, 分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域网) 上发布信息成了一件很容易的事。 IIS最经典的版本是IIS6.0,最常见于Windows Server 2003系统中;IIS7.0则常见于 Windows Server 2008中。 目前(2017年)最新的版本是IIS10.0,常见于Windows Server 2016中。

Apache

1、Apache 是 LAMP 架构最核心的 Web Server,开源、稳定、模块丰富是 Apache 的优势。但 Apache 的缺点是有些臃肿,内存和 CPU 开销大,性能上有损耗,不如一些轻量级的 Web 服务器(譬如:Nginx、Tengine等)高效,轻量级的 Web 服务器对于静态文件的响应能力来说远高于 Apache 服务器。

2、Apache 做为 Web Server 是负载 PHP 的最佳选择,如果流量很大的话,可以采用 Nginx 来负载非 PHP 的 Web 请求。Nginx 是一个高性能的 HTTP 和反向代理服务器,Nginx 以其稳定、丰富功能集、示例配置文件和低系统资源的消耗而闻名。Nginx 现能支持 PHP 和 FastCGI,也支持负载均衡和容错,可和 Apache 配合使用,是轻量级的 HTTP 服务器的首选。

3、Web 服务器缓存也有多种方案,Apache 提供了自己的缓存模块,也可以使用外加的 Squid 模块进行缓存,这两种方式均可有效提高 Apache 的访问响应能力。Squid Cache 是一个 Web 缓存服务器,支持高效缓存,可作为网页服务器的前置 cache 服务器缓存相关请求以提高 Web 服务器速度。把 Squid 放在 Apache 的前端来缓存 Web 服务器生成动态内容,而 Web 应用程序只需要适当地设置页面实效时间即可。如访问量巨大,则可考虑使用 memcache 作为分布式缓存。

4、PHP 的加速可使用 eAccelerator 加速器,eAccelerator 是一个自由开放源码的 PHP 加速器。它会优化动态内容缓存,提高 PHP 脚本缓存性能,使 PHP 脚本在编译状态下,对服务器的开销几乎完全消除。它还可对脚本起优化作用,以加快其执行效率。 使 PHP 程序代码执效率可提高 1-10 倍。

Tomcat

Tomcat(Apache Tomcat)是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun和其他公司及个人共同开发而成。

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。

实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能。

另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。

b. Nginx的请求处理阶段

Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是 post-read、server-rewrite、find-config、rewrite、post-rewrite、preaccess、access、post-access、try-files、content 以及 log。

nginx1

agentzh 的 Nginx 教程

彩蛋

Apache请求处理循环详解 :

1、Post-Read-Request阶段: 在正常请求处理流程中,这是模块可以插入钩子的第一个阶段。对于那些想很早进入处理请求的模块来说,这个阶段可以被利用。

2、URI Translation阶段 : Apache在本阶段的主要工作:将请求的URL映射到本地文件系统。模块可以在这阶段插入钩子,执行自己的映射逻辑。mod_alias就是利用这个阶段工作的。

3、Header Parsing阶段 : Apache在本阶段的主要工作:检查请求的头部。由于模块可以在请求处理流程的任何一个点上执行检查请求头部的任务,因此这个钩子很少被使用。mod_setenvif就是利用这个阶段工作的。

4、Access Control阶段 : Apache在本阶段的主要工作:根据配置文件检查是否允许访问请求的资源。Apache的标准逻辑实现了允许和拒绝指令。mod_authz_host就是利用这个阶段工作的。

5、Authentication阶段 : Apache在本阶段的主要工作:按照配置文件设定的策略对用户进行认证,并设定用户名区域。模块可以在这阶段插入钩子,实现一个认证方法。

6、Authorization阶段 : Apache在本阶段的主要工作:根据配置文件检查是否允许认证过的用户执行请求的操作。模块可以在这阶段插入钩子,实现一个用户权限管理的方法。

7、MIME Type Checking阶段 : Apache在本阶段的主要工作:根据请求资源的MIME类型的相关规则,判定将要使用的内容处理函数。标准模块mod_negotiation和mod_mime实现了这个钩子。

8、FixUp阶段 : 这是一个通用的阶段,允许模块在内容生成器之前,运行任何必要的处理流程。和Post_Read_Request类似,这是一个能够捕获任何信息的钩子,也是最常使用的钩子。

9、Response阶段 : Apache在本阶段的主要工作:生成返回客户端的内容,负责给客户端发送一个恰当的回复。这个阶段是整个处理流程的核心部分。

10、Logging阶段 : Apache在本阶段的主要工作:在回复已经发送给客户端之后记录事务。模块可能修改或者替换Apache的标准日志记录。

11、CleanUp阶段 : Apache在本阶段的主要工作:清理本次请求事务处理完成之后遗留的环境,比如文件、目录的处理或者Socket的关闭等等,这是Apache一次请求处理的最后一个阶段。

3+4. HTTP协议

HTTP请求:Hyper Text Transfer Protocol的缩写,即超文本传输协议。

a. HTTP协议的结构

HTTP报文由客户机到服务器的请求和从服务器到客户机的相应构成。

① 请求报文的组成:

请求行 + 信息头 + 请求头 + 实体头 + 报文主体

请求行的格式如下:

Method [分隔符] Request - URL [分隔符] HTTP-Version CRLF

解释说明:

  (1)Method 表示完成Request - URL的方法,该字段是大小写敏感的,据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:

方法 描述
HEAD HEAD方法跟GET方法相同,只不过服务器响应时不会返回消息体
PUT 把消息本体中的消息发送到一个URL,跟POST类似
TRACE 是用来调用一个远程的请求信息应用程序层的循环后退
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
DELETE 请求服务器删除Request-URI所标识的资源
GET 由客户端请求服务端获取Request-URI所标识的资源的方法
POST 由客户端向服务端提交Request-URI所标识的资源后附加新的数据
OPTIONS 请求获得由Request-URI标识的资源在请求/响应的通信过程中可以使用的功能选项

  (2)[分隔符]为空格

  (3)Request - URL: 遵循URL格式,此字段为星号(*)时,说明请求并不用于某个特定的资源地址,而是用于服务本身。

  (4)HTTP-Version:表示支持的HTTP版本,如HTTP/1.1

  (5)CRLF:表示换行回车符

    HTTP的头包括通用的信息头、请求头、响应头、实体头4部分,每个头域由一个域名、冒号和值域3部分组成。域名是大小写无关的;域值前可以添加任何数量的空格,每个HTTP请求可以包含多个HTTP头域。

    HTTP报文主体则包含了HTTP请求的内容,对于get方法,报文主体为空,对于post方法,报文主体则包含需要发送给服务器的数据。

② 响应报文的组成:

状态行 + 信息头 + 响应头 + 实体头 + 报文主体

解释说明:

  (1)状态行由状态码和原因分析两部分组成,其中,状态码由3位数字组成,表示请求是否被理解或被满足,用来支持自动操作;原因分析是对原文的状态码作简单的描述,用于供用户使用。

3、无论是请求报文还是响应报文,虽然分别由以上五个部分组成,但是在一定情况下有些并不是必须要的,但是对于:General-header(通用头部)、请求头(客户端->服务器[Request Header])、响应头(服务端->客户端[Response Header]) 这三部分是必须要有的。于是我那一个实例来对这三部分的内容进行说明记录:

(1)General-header(通用头部)

Request URL: http://115.148.141.110:8980/v1/purchase/list     # 请求的URL地址(包含请求类型、请求域名、请求端口、请求地址)
Request Method: POST                               # 请求方式
Status Code: 200 OK                                            # 响应的状态码、结果 
Remote Address: 127.0.0.1:8899                                 # 请求的远程地址       
Referrer Policy: no-referrer-when-downgrade                    # referrer策略(五种方法)

(2)请求头(客户端->服务器[Request Header])

POST /v1/purchase/list HTTP/1.1       # 请求方式、请求地址、请求所使用的协议和版本
Host: 115.157.151.673:8180            # 目标主机地址和端口号
Connection: keep-alive                # 维护客户端和服务端的连接关系 
Content-Length: 68                    # 描述HTTP消息实体的传输长度
Accept: application/json, text/javascript, */*; q=0.01     #发送端(客户端)希望接受的数据类型、q 是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容
Origin: http://apptest.zhidianlife.com:8007          # 浏览器在referrer字段中只显示源网站的源地址(即协议、域名、端口),而不包括完整的路径  
Authorization: c81e7286507f4aa4b6179f4c381b4c64       # 请求所需的认证信息
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36          # 客户端版本号的名字
Content-Type: application/json              # 请求实体,文档类型
Referer: http://apptest.zhidianlife.com:8007/procurement/order?_t=756512&_winid=w9290         #  从来于哪里
Accept-Encoding: gzip, deflate        # 客户端接收编码类型,一些网络压缩格式: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9       # 客户端接收的语言类型 、中文

(3)响应头(服务端->客户端[Response Header])

HTTP/1.1 200 OK             		# 请求协议以及本版、请求状态码
Date: Tue, 02 Jul 2019 14:07:31 GMT # 服务端响应客户端的内容过期时间
Content-Type: application/json; charset=utf-8     # 服务端发送的类型及采用的编码方式
Server: Kestrel                # WEB 服务器 服务端的Web服务端名
Vary: Origin  						# WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求
Access-Control-Allow-Credentials: true  # 允许运行客户端携带证书式访问   
Access-Control-Allow-Origin: http://apptest.zhidianlife.com:8007
Content-Length: 33310         # 允许指定的域名、地址访问

其中涉及到前端页面性能问题的字段主要有以下:Accept-Encoding、Connection、Date

③HTTP状态码的分类

分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

参考文章:

nginx 反向代理

LAMP和LNMP,你更愿意选择谁,为什么?

posted @ 2020-05-10 23:42  chalan630  阅读(478)  评论(0编辑  收藏  举报