随着web2.0时代的到来,互联网从传统的C/S架构转变为更方便更便捷的B/S架构。当客户端与web服务器进行交互时,就存在web请求,这种请求都基于统一的应用层协议(HTTP协议)交互数据
HTTP协议解析
http即超文本传输协议,是一种详细规定了了浏览器和万维网服务器之间互相通信的规则,他是万维网交换信息的基础,它允许将HTML(超文本标记语言)文档从web服务器传送到web浏览器
http协议目前最新版的版本时1.1,HTTP是一种无状态的协议。无状态是指web浏览器与web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发送请求(reaquest),然后web服务器返回响应(response),连接就关闭了,在服务端不保留连接的有关信息。也就是说,HTTP请求只能由客户端发起,而服务器不能主动向客户端发送数据
HTTP请求与响应
HTTP请求包括三部分,分别是请求行(请求方法)、请求头(消息报头)和请求正文。
(1)HTTP请求
HTTP请求包括三部分,分别是请求行(请求方法)、请求头(消息报头)和请求正文。下面是HTTP请求的一个例子
POST /login.php HTTP/1.1 //请求行
HOST:www.xxser.com //请求头
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0
//空白行,代表请求头结束
Username=admin&password=admin //请求正文
HTTP请求行的第一行即为请求行,请求行由三部分组成,该行的第一部分说明了该请求是POST请求;该行的第二部分是一个斜杠(/login.php),用来说明请求的是该域名根目录下的login.php;该行的最后一部分说明使用的是HTTP1.1版本(另一个可选项是1.0)
第二行至空白行为HTTP中的请求头(也被称为消息头)。其中,HOST代表请求的主机地址,User-Agent代表浏览器的标识,请求头由客户端自行设定。
HTTP请求的最后一行为请求正文,请求正文是可选的,它最常出现在post请求方法中
HTTP响应
HTTP响应的第一行为响应行,其中有HTTP版本、状态码以及消息
第二行至末尾的空白行为响应头,由服务器向客户端发送
消息报头之后为响应正文,是服务器向客户端发送的HTML数据
HTTP请求方法
HTTP请求的方法非常多,其中GET、POST最为常见。下面是HTTP请求方法的详细介绍
(1)GET
GET方法用于获取请求页面的指定信息(以实体的格式)。如果请求资源为动态脚本(非HTML),那么反户籍文本是web容器解析后的HTML源代码,而不是源文件。例如请求index.jsp,返回的不是index.jsp的源文件,而是经过解析后的HTML代码。
(2)HEAD
HEAD方法除恶服务器不能在响应里返回消息主体外,其他斗鱼GET方法相同。此方法经常被用来测试超文本链接的有效性、可访问性和最近的改变。攻击者编写扫描工具时,就常用此方法,因为只测试资源是否存在,而不用返回消息主体,所以速度一定是最快的
(3)POST
POST方法也与GET方法相似,但最大的区别在于,GET方法没有请求内容,而POST是有请求内容的。POST请求最多用于向服务器发送大量的数据。GET虽然也能发送数据,但是有大小(长度)的限制,并且GET请求会将发送的数据显示在浏览器端,而POST则不会,所以安全性相对来说高一些
(4)PUT
PUT方法用于请求服务器把请求中的实体存储在请求资源下,如果请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据,作为指定资源的最新修改版。如果请求指定的资源不存在,将会创建这个资源,且数据位请求正文
因为他会为服务器建立文件,服务器一般都会关闭此方法
(5)DELETE
DELETE方法用于请求远服务器删除请求的指定资源。服务器一般都会关闭此方法,因为客户端可以进行删除文件操作
(6)TRACE
TRACE方法被用于激发一个远程的应用层的请求笑死回路,也就是说,回显服务器收到的请求。TRACE方法允许客户端去了解数据被请求链的另一端接收的情况,并且利用那些数据信息去测试或诊断。但此方法非常少见
(7)CONNECT
HTTP1.1协议规范保留了CONNECT方法,此方法是为了用于能动态切换到隧道的代理
(8)OPTIONS
OPTIONS方法是用于请求获得由URL标识的资源在i请求/响应的通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能
以上为HTTP/1.1标准方法,但HTTP的请求方法还不止这些,例如webDSV等等
HTTP状态码
当客户端发出HTTP请求,服务端接收后,会向客户端发送响应信息,其中,HTTP响应中的第一行中,最重要的一点就是HTTP的状态码,内容如下:
- 1xx:信息提示,表示请求已被成功接收,继续处理。其范围为100~101
- 2xx:成功,服务器成功地处理了请求,其范围为200~206
- 3xx:重定向,重定向状态码用于告诉浏览器客户端,他们访问的资源已被移动,并告诉客户端新的资源地址位置。这时,浏览器将重新对新资源发起请求。其范围为300~305
- 4xx:客户端错误状态码,有时客户端会发送一些服务器无法处理的东西,比如格式错误的请求,或者最常见的是,请求一个不存在的URL。其范围为400~415
- 5xx:有时候客户端发送了一条有效请求,但web服务器自身却出错了,可能是web服务器运行出错了,或者网站都挂了。5xx就是用来描述服务器内部错误的,其范围为500~505
常见的状态码描述如下
200:客户端请求成功,是最常见的状态
302:重定向
404:请求资源不存在,是最常见的状态
400:客户端请求有语法错误,不能被服务器所理解
401:请求未经授权
403:服务器收到请求,但是拒绝提供服务
500:服务器内部错误,是最常见的状态
503:服务器当前不能处理客户端的请求,一段事件后可能恢复正常
HTTP消息
HTTP消息又称为HTTP头,由四部分组成,分别是请求头、响应头、普通头和实体头。从名称上看,我们就可以知道他们所处的位置
(1)请求头
请求头只出现在HTTP请求中,请求报头允许客户端向服务端请求附加信息和客户端自身的信息。常用的HTTP请求头如下。
- Host Host请求报头域主要用于指定被请求资源的internet主机和端口号
- Use-Agent Use-Agent请求报头域允许客户端将他的操作系统、浏览器和其他属性告诉服务器。登陆一些网站时,很多时候都可以见到显示我们的浏览器、系统信息,这些都是此头的作用
- Referer Refrer包含一个URL,代表当前访问URL上的一个URL,也就是说,用户是从什么地方来到本页面
- Cookie Cookie是非常重要的请求头,他是一段文本,常用来表示请求者身份等。
- Range Range可以请求实体的部分内容,多线程下载一定会用到此请求头
- x-forward-for 即XXF头,他代表请求端的IP,可以有多个,中间以逗号隔开
- Accept Accept请求报头域用于指定客户端接收哪些MIME类型的信息,如Accept:text/html,表明客户端希望接受HTML文本
- Accept-Charset 请求报头域用于指定客户端接收的字符集
(2)响应头
响应头是服务器根据请求向客户端发送的HTTP头。
- Server 服务器所使用的web服务器名称,攻击者通过查看此头,可以探测web服务器名称。所以建议在服务器端进行修改此头的信息
- Set-Cookie 向客户端设置cookie,通过查看此头,可以清楚的看到服务器向客户端发送的cookie信息
- Last-Modified 服务器通过这个头告诉浏览器,资源的最后修改时间
- Location 服务器通过这个头告诉浏览器去访问哪个页面,浏览器接收到这个请求之后,通常会立刻访问Location头所指向的页面。这个头通常配合302状态吗使用
- Refresh 服务器通过Refresh头告诉浏览器定时刷新浏览器
(3)普通头
在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,至用于传输的消息。例如:Data表示消息产生的日期和事件。connection,允许发送制定连接选项
注:普通报头作为了解即可
(4)实体头
请求和响应消息都可以传送一个实体头。实体头定义了关于实体正文和请求所标识的资源的元信息。元信息也就是实体内容的属性,包括实体信息类型、长度、压缩方法、最后一次修改时间等。常见的实体头如下
- Content-Type 用故意向接收方指示实体的介质类型
- Content-Encoding 被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用响应的解码机制
- Content-Length 用于指明实体正文的长度,以字节方式存储的十进制数字来表示
- Last-Modified 用于指示资源的最后修改日期和时间
HTTP协议和HTTPS协议的区别
HTTPS协议的全称为Hypertext Transfer Protocal over Secure Socket Layer,它是以安全为目标的HTTP通道,其实就是HTTP的“升级”,只是它比单纯的HTTP协议更加安全
HTTPS的安全基础是SSL,即在HTTP下加入SSL层。也就是HTTPS通过安全传输机制进行传送数据,这种机制可保护网络传送的所有数据的隐秘性和完整性,可以降低非侵入性拦截攻击的可能性
既然是在HTTP的基础上进行构建的HTTPS协议,所以,无论怎么样,HTTP请求与响应都是以相同的方式进行工作的
HTTP协议与HTTPS协议的主要区别如下。
- HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议
- HTTP与HTTPS协议使用的是完全不同的连接方式,HTTP采用80端口连接,而HTTPS则是443端口
- HTTPS协议需要到ca申请证书,一般免费证书很少,需要缴费,也有些web容器提供,如TOMCAT.而HTTP协议则不需要
- HTTP连接相对简单,是无状态的,而HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,相对来说,他要比HTTP协议更安全
作为一名web开发人员,一定要牢记,前端javascript验证是为了防止用户输入错误,服务器端验证是为了防止恶意攻击
HTTP应用:黑帽SEO之搜索引擎劫持
SEO(search engine optimization)即为搜索引擎优化。简单的说,就是让网站的排名更高
那么黑帽SEO就是通过作弊的手段欺骗搜索引擎,获取非正常的排名,让网站更靠前,流量更大
案例:直接输入域名可以进入自己的网站,而使用百度、google等搜索引擎搜索关键字看到自己的网站后,再打开却跳转到其他的网站。客户说自己已经用web杀毒扫描过,并没有发现木马等病毒
其实这是黑帽SEO利用HTTP协议搞的鬼
在HTTP中有个请求头叫Referer,还有一个头叫做User-agent,黑帽SEO就是利用这两个头来欺骗搜索引擎的。Referer头用于告诉web服务器用户使用的浏览器和操作系统等信息。当用户通过搜索引擎打开此网站时,一般会引出referer头
利用这点,黑帽SEO就可以用任何web语言进行针对搜索引擎的流量劫持,一般步骤如下。
- 建立劫持搜索引擎库,如baidu、google等域名为关键字
- 获取HTTP referer头
- 遍历搜索引擎库,并与referer的内容相比较,如果两者相同或存在搜索引擎关键字,那么页面将会发生跳转,也就是域名劫持
这就是针对搜索引擎的劫持,那么user-agent又能做什么呢?user-agent主要来劫持搜索引擎的蜘蛛,与劫持流量类似,但是具体的作用不一样,例如ipad,iphone关键字等等,就跳转到手机端的黑客构造的页面