文章目录
前言
Web机制:客户端
(用户、浏览器)+ 服务端
(Web容器+中间件+数据库)。
1. HTTP
HTTP(Hyper Text Transfer Protocol,超文本传输协议)是浏览器与服务端之间的通信协议。
HTTP将HTML文档传输到Web历览器中进行访问。HTTP是一个请求和响应的协议,浏览器发出请求,服务端向请求做出回应。
HTTP在网络中传输是以明文的形式,所以就会产生明文传输漏洞。为了解决这个问题,可以使用加强版的HTTPS协议,其在HTTP的基础上加上了一个安全套接字层SSL,但也会存在如 HTTPS 降级等漏洞问题。
HTTP 默认端口为80
,HTTPS 默认端口为 443
。
1 . 1 协议特点
HTTP是一个请求和响应的协议,浏览器发出请求,服务端向请求做出回应。
- 采用B/S架构模式(浏览器/服务器)
- 协议是无状态的协议
- 浏览器向服务器发出请求时,只需传输
请求方法
和请求路径
- 允许传输任意类型的数据对象
1 . 2 URL
URL(Uniform Resource Locator,统一资源定位符),是全球唯一的,用来告诉Web容器,浏览器请求资源的路径。
标准格式:
schema://login:password@address:port/path/to/resource/?query_string#fragment
URL参数 | 说明 | 实例 |
---|---|---|
schema | 协议 | http |
login:password | 用户名:密码 | |
address | 服务器地址IP | 192.168.109.100 |
port | 端口号 | 80 |
path/to/resource | 请求资源路径 | /cms/index.html |
query_string | 请求参数 | name=dai |
fragment | 锚点 |
例子:
# http
http://192.168.109.100/cms/
# ftp
ftp://ftpuser:ftppassword@192.168.109.100
URL编码:URL从Path
开始只能出现A-Za-z0-9
,-_.~
其他符号都会被URL编码。
符号 | URL编码 |
---|---|
# | %23 |
%20 | |
& | %26 |
> | %3e |
1 . 3 Request请求报文
HTTP 请求报文由 请求行、请求头、请求正文 三部分组成。下面是一个完整的HTTP请求报文:
GET /cms/ HTTP/1.1
Host: 192.168.109.100
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.125 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.109.100/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close
1 . 3 .1 请求行
请求行是报文的第一行,由空格字符将其分为三部分,所以空格等字符不能随便出现。
GET /cms/ HTTP/1.1
说明:
列数 | 说明 | 例子 |
---|---|---|
1 | 请求方法 | GET |
2 | 资源路径 | /cms/ |
3 | 协议版本 | HTTP/1.1 |
请求方法总结:
请求方法 | 说明 |
---|---|
GET | 用于请求服务器发送某个资源 |
POST | 提交表单或上传文件 |
HEAD | 请求资源,但只请求头部,不请求正文 |
OPTIONS | 测试服务器所支持的方法 |
TRACE | 回显浏览器的请求 |
PUT | 向服务器写入文档 |
DELETE | 请求服务器删除指定资源 |
1 . 3 .2 请求头
从请求报文第二行开始到第一个空行为止的内容。请求头包含了很多字段。
请求头字段 | 说明 |
---|---|
Host | 指定被请求资源的服务器地址和端口号 |
User-Agent | 浏览器信息,浏览器指纹 |
Referer | 当前URL的上一个URL |
Cookie | 请求者的身份信息,类似于身份证 |
Content-Type | 指明实体的介质类型 |
Content-Length | 指明实体的正文长度 |
Authorization | 基本认证 |
1 . 3 .3 请求正文
一般为POST方法,第一个空行以后的内容。
1 . 3 .4 常见传参方式
-
POST传参
提交的参数放在请求正文中。
-
GET传参
向服务器提交的参数存放在URL中,例如
?name=dai
,向服务器传输多个参数用& 连接。
1 . 4 Response响应报文
响应报文由 响应行、响应头、响应报文 三部分组成。下面是一个完整的HTTP响应报文:
HTTP/1.1 200 OK
Date: Mon, 05 Aug 2024 02:43:55 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Content-Length: 7314
Connection: close
Content-Type: text/html; charset=utf-8
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
。。。。。
1 . 4 .1 响应行
响应报文的第一行。
HTTP/1.1 200 OK
说明:
列数 | 说明 | 例子 |
---|---|---|
1 | 协议版本 | HTTP/1.1 |
2 | 响应状态码 | 200 |
3 | 描述短句 | OK |
常见响应状态码:
状态码 | 类型 | 常见状态码 |
---|---|---|
1XX | 信息性状态码 | – |
2XX | 成功状态码 | 200、201 |
3XX | 重定向状态码 | 302、304 |
4XX | 客户端错误状态码 | 404、403 |
5XX | 服务端错误状态码 | 500 |
1 . 4 .2 响应头
从响应报文第二行开始到第一个空行为止的内容。响应头包含了很多字段。
Date: Mon, 05 Aug 2024 02:43:55 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Content-Length: 7314
Connection: close
Content-Type: text/html; charset=utf-8
说明:
响应头字段 | 说明 |
---|---|
Date | 时间 |
Server | Web服务器指纹 |
Refresh | 服务器端告知浏览器定时刷新浏览器 |
Content-Length | 正文长度 |
Connection | 连接 |
Content-Type | 响应正文的类型 |
Set-Cookie | 服务器向浏览器端写入Cookie信息 |
1 . 4 .3 响应正文
浏览器接收到的HTML代码,服务器返回的资源内容。
2. Web会话
当我们进行网购时,选择商品、加入购物车、付款这一系列流程都是需要保持用户登录状态的。Web会话技术就是用来管理Web应用程序在多个页面和请求之间保持用户登录状态的一种技术。
HTTP协议本身是无状态的协议,所以HTTP协议不会记录会话状态,不同的请求之间是没有任何联系的。所以我们希望在浏览器与服务器交互的这个会话期间,服务器可以保持对浏览器会话的识别,也就是保持HTTP的状态。
2 .1 Cookie
Cookie(Cookies)技术就是我们用来辨别用户身份,进行会话跟踪而存储在本地终端上的一段文本。它由服务器在进行HTTP响应的时候发送给浏览器,每当浏览器向服务器发送请求的时候,它会自动将响应的Cookie包含在请求中,如果服务器识别了这个自动发送的Cookie信息,那么服务器就识别了会话。
2 .2 Session
Session 是一种可以保留更多信息在服务端的一种技术,服务器会为每一个客户端开辟一块内存空间(Session对象),客户端在发送请求的时候,都可以使用之间的Session。
2 .3 固定会话攻击
-
窃取
F12,在命令行执行。
alter(document.cookie)
-
获取到Cookie信息
username=admin; userid=1; PHPSESSID=mcm25gpg74qp4gpn9sv54tj754
-
进行欺骗
在没有Cookie信息的时候,我们将这三条命令(根据Cookie进行替换)在命令行执行,再次刷新就可以进去。
document.cookie = "username=admin;"; document.cookie = "userid=1;"; document.cookie = "PHPSESSID=mcm25gpg74qp4gpn9sv54tj754";