文章目录
- 一、HTTP
- 1.1 HTTP方法
- 1.2 HTTP消息头
- 1.3 cookie
- 1.4 状态码
- 二、web功能
- 2.1 服务器端功能
- 2.2 客户端功能——同源策略
- 三、编码方案
- 3.1 URL编码
- 3.2 Unicode编码
- 3.3 HTML编码
- 3.4 Base64编码
一、HTTP
HTTP(超文本传输协议)是web应用程序使用的通信协议,它是一种消息模型:客户端送出一条请求消息,而后由服务端返回一条响应消息。该协议基本上不需要连接,虽然HTTP使用有状态的TCP协议作为传输机制,但每次请求与响应交换都自动完成,并且可能使用不同的TCP连接。
1.1 HTTP方法
1. GET: 发送一个请求来取得服务器上的某一资源.
2. POST: 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。
3. HEAD: 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。
4. OPTIONS: 客户端询问服务器可以提交哪些请求方法。
5. PUT: 从客户端向服务器传送的数据取代指定的文档的内容,即指定上传资源存放路径。# 本质上来讲, PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。
6. PATCH: 是对 PUT 方法的补充,用来对已知资源进行局部更新。
7. DELETE: 请求服务器删除指定的资源。
8. TRACE: 让Web服务器端将之前的请求通信还给客户端的方法。
9. CONNECT: 要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。
1.2 HTTP消息头
- 常见消息头
1.connection: 这个消息头用于告诉通信的另一端,在完成HTTP传输后是关闭TCP连接,还是保持连接开放以接收其他消息; 2. Content-Encoding: 为消息主体的内容指定编码形式; 3. Content-Length: 规定消息主体的字节长度; 4. Content-Type: 规定消息主体的内容类型; 5. Transfer-Encoding:指定为方便其通过HTTP传输而对消息主体使用的编码形式。如果使用这个消息头,通常用它指定块编码。
- 请求消息头
1.Accept: 用于告诉服务器客户端愿意接受哪些内容; 2.Accept-Encoding:用于告诉服务端,客户端愿意接受哪些内容编码; 3.Authorization: 为一种内置HTTP身份验证向服务器提交证书; 4.Cookie: 向服务器提交它以前发布的cookie; 5.Host: 主机名 6.If-Modified-Since: 说明浏览器最后一次收到所请求的资源的时间,若自那以后资源没有发生变化,服务器就会返回一个304的响应,指示客户端使用资源的缓存副本。 7. If-None-Match: 指定实体标签,服务器可以通过该实体标签确认浏览器是否使用资源的缓存副本; 8. Origin: 用在Ajax请求中,用于指示提出请求的域; 9. Referer:用于指示提出当前请求的原始URL。 10.User-Agent: 向服务器提供与浏览器或生成请求的其他客户端软件有关的信息; 11.X-Forwarded-For: 记录客户端的真实 IP 地址。其格式通常是一个以逗号分隔的IP地址列表:<原始IP>,<代理IP1>,<代理IP2>,...
- 响应消息头
1.Access-Control-Allow-Origin: 用于指示是否允许通过Ajax请求获取资源; 2.Cache-Control: 用于向浏览器传送缓存指令; 3.ETag: 指定实体标签。客户端刻在将来的请求中提交这个标识符,获得和If-None-Match消息头中相同的资源,通知服务端浏览器当前缓存中保存的是哪个版本的资源。 4.Expires: 用于向浏览器说明消息主体内容的有效时间。在这个时间之前,浏览器可以使用这个资源的缓存副本。 5.Location: 重定向目标; 6.Pragma: 向浏览器传送缓存指令(如no-cache); 7.Server: 提供web服务器软件的相关信息; 8.Set-Cookie: 用于向客户端发布cookie,浏览器会在随后的请求中将其返回给服务器。 9. WWW-Authenticate: 用在401状态码的响应中,提供与服务器所支持的身份验证类型有关的信息; 10.X-Frama-Options: 指示浏览器框架是否及如何加载当前响应。
1.3 cookie
cookie一般由一个名/值对构成,如果服务器发布多个cookie,可在一个Cookie
消息头中用;
进行分隔,并将其全部返回给服务器。Set-Cookie
消息头中,除了cookie的实际值外,还有一些可选属性:
1.expires: 用于设定cookie的有效时间;
2.domain: 指定cookie的有效域。这个域必须和收到cookie的域相同,或者是它的父域;
3.path: 指定cookie的有效URL路径;
4.secure: 如果设置该属性,仅在HTTPS请求中提交cookie;
5.HttpOnly: 如果设置该属性,将无法通过客户端Javascript直接访问cookie
1.4 状态码
状态码可分为五类:
- 1XX——提供信息;
- 2XX——请求被成功提交;
- 3XX——客户端被重定向到指定资源;
- 4XX——请求包含某种错误;
- 5XX——服务端执行请求时遇到错误。
100 Continue:当客户端提交一个包含主体的请求时,将发送这个响应。该响应表示已收到请求消息头,客户端应继续发送消息主体,请求完成后,再由服务端返回另一个响应。
200 Ok: 已成功提交请求,且响应主体中包含请求结果。
201 Created: PUT请求的响应返回的状态码,表示请求已成功提交。
301 Moved Permanently: 永久重定向到另外一个在Location消息头中指定的URL。
302 Found: 暂时重定向到另外一个在Location消息头中指定的URL。
304 Not Modified: 指定浏览器使用缓存中保存的所请求资源的副本。
400 Bad Request: 客户端提供无效的HTTP请求。
401 Unauthorized: 服务器在许可请求前要求HTTP进行身份验证。www-Authenticate消息头详细说明所支持的身份验证类型。
403 Forbidden: 不管是否通过身份验证,禁止任何人访问被请求的资源。
404 Not Found:所请求的资源不存在。
405 Method Not Allowed: 指定的URL不支持请求中使用的方法。
413 Request Entity Too long: 请求主体过长;
414 Request URI Too Long: URL太长;
500 Internal Server Error: 服务器在执行过程中遇到错误。
503 Service Unavailable: 尽管web服务器运转正常,并且能够响应请求,但是服务器访问的应用程序还是无法做出响应。
二、web功能
2.1 服务器端功能
当前web应用程序主要向用户提供动态生成的内容。当用户请求一个动态资源时,服务器会动态建立响应,每个用户都会收到满足其特定需要的内容,动态内容由在服务器上执行的脚本或其他代码生成。
当用户的浏览器提出访问动态资源的请求时,它不仅仅要求访问该资源的副本,通常还会提交各种参数。HTTP请求主要使用以下方式向应用程序传送参数:
- 通过URL查询字符串;
- 通过Rest风格的URL的文件路径;
- 通过POST方法中使用的消息主体。
服务器端相关技术如下:
- 脚本语言:如php、java、asp等;
- web服务器:直接提供资源或转发请求到 Web 容器。常用功能:处理静态内容、HTTP 请求、负载均衡、代理。常用的web服务器有:Apache、Nginx、IIS等
- web容器:执行应用程序代码,生成动态响应。常见的web容器有:Apache Tomcat、Weblogic、JBoss等。
- web应用程序平台:是一个用于开发、部署和运行 Web 应用程序的环境或框架。如ASP.net和Java。
- 数据库:如mysql、oracle、mssql等;
- 其他后端组件:如文件系统、基于SOAP的web服务、目录服务等。
一个典型的 Java Web 应用程序架构可能如下:
客户端浏览器 → Nginx(Web 服务器)→ Tomcat(Web 容器)→ MySQL(数据库)
- 客户端浏览器:发送 HTTP 请求。
- Nginx:处理静态内容请求,将动态请求转发到 Tomcat。
- Tomcat:运行 Java Web 应用程序,处理业务逻辑。
- MySQL:存储应用程序数据。
2.2 客户端功能——同源策略
主要写一下同源策略。同源策略主要用来防止不同来源的内容相互干扰。同源指的是协议、端口、域名都相同。同源策略的特点如下:
- DOM 访问:一个页面的 JavaScript 代码不能访问跨源页面的 DOM。
如果你尝试从一个页面(http://example.com)通过 JavaScript 访问另一个页面(http://other.com)的 DOM,浏览器会抛出一个错误,提示跨域访问被拒绝。
- Cookie、LocalStorage 和 SessionStorage:不能读取或修改跨源页面的存储数据。
http://malicious.com 无法读取 http://example.com 的 Cookie。
- AJAX 请求:不能直接向跨源服务器发起 HTTP 请求(除非服务器支持 CORS,即跨源资源共享)
三、编码方案
3.1 URL编码
URL只允许使用US-ASCII字符集中的可打印字符(也就是ASCII代码在0x20~0x7e范围内的字符)。URL编码的目的是使有问题的字符可通过HTTP协议安全传输。
URL编码的特征:**%**作为前缀,后面接这个字符的两位十六进制ASCII码。常见的URL编码字符:
%3d 代表 =
%25 代表 %
%20和+ 代表 空格
%0a 代表 换行
%00 代表 空字节
当攻击web应用程序是,需要将以下字符当做数据插入到HTTP请求中,需要进行URL编码:
空格、%、?、&、=、;、+、#
。
3.2 Unicode编码
Unicode编码特征:以%u
为前缀,其后是该字符的十六进制unicode码点。如%u2215
代表/
。
URF-8是一种长度可变的编码标准,使用一个或多个字节表示字符。其特征为:以%
为前缀,其后使用十六进制表示每个字节。如%e2%89%a0
代表不等号。
3.3 HTML编码
HTML编码定义了大量HTML实体来表示特殊的字面量字符,如:
" 代表 "
' 代表 '
任何字符都可以使用它的十进制ASCII进行HTML编码,如:
" 代表 "
' 代表 '
或者使用十六进制的ASCII(以x
为前缀),如:
" 代表 "
' 代表 '
3.4 Base64编码
Base64只包含可打印的ASCII字符:A-Z、a-z、0-9、+、/、=
,最显著的特征就是出现双等号,一定是Base64编码。