HTTP:
HTTP请求:所有HTTP请求都包含一个单行显示的消息头,然后是一个强制空白行,最后是一个消息主体。
每个HTTP请求第一行都有三个项目,每个项目以空格分开:
- 一个HTTP方法的动词。比如最常用的GET,它主要作用是从web服务器获取一个资源。
- 所请求的URL。该URL通常由所请求的资源名称,以及一个客户端向该资源提交的参数的可查询字符串组成。URL中查询字符串以 ' ?' 标识,后面紧接着参数和参数的值。
- HTTP版本。
以上三部分即为HTTP请求的第一行内容
消息头:
- Referer : 用于表示发出请求的原始URL,如点击网页上一个链接。
- User-agent : 提供浏览器或其他生成请求的客户端软件的有关信息。
- Host : 指定被访问的完整URL中的主机名称。当几个站点以一台相同的服务器为主机,HTTP请求的第一行中的URL通常不会包含主机名称,这时就要用Host消息头。
- Cookie : 提交服务器向客户端发送的其他参数。
常用消息头:
- Connection : 用于告诉通信的另一端在完成HTTP传输后是断开TCP连接还是保持连接来接受其他信息。
- Content-Encoding : 为消息主体中的内容指定编码形式
- Content-Length : 规定消息主体的字节长度。
- Content-Type :规定消息主体的内容类型。
- Transfer-Encoding : 指定为方便其通过HTTP传输而对消息主体使用的任何编码。
请求消息头:
- Accept : 这个消息头用于告诉服务器客户端愿意接受什么类型,哪些内容,图像还是文档。
- Accept-Encoding : 用于告诉服务器,客户端愿意接受那些内容编码。
- Authorization (授权): 用于为一种内置HTTP身份验真向服务器提交证书。
- Cookie(存储在用户本地终端上的数据) : 用于向服务器提交它以前发布的cookie
- If-Modified-Since : 说明浏览器最后一次收到所请求的资源的名称,如果资源在那以后没有发生变化,那么服务器会发出一个状态码为304的响应,让客户端使用缓存副本。
- If-None-Match : 实体标签是一个说明消息主体内容的标识符,而这个消息头用于指定一个实体标签。当最后一次收到所请求的资源时,浏览器提交服务器发布的实体标签,服务器用这些实体标签确定浏览器是否使用资源的缓存副本。
- Origin : 用于指示提出请求的域。用在跨域Ajax请求中。
- Host
- Referer
- User-Agent
响应消息头:
- Access-Control-Allow-Origin : 指示可否通过跨域Ajax请求获取资源。
- Cache-Control : 用于向浏览器发送缓存指令。
- ETag : 指定一个实体标签。客户端可在将来的请求中提交这个标识符,获得和If-None-Match消息头中相同的资源,通知服务浏览器当前保存的是哪个版本的资源。
- Expiress : 向浏览器说明消息主体内容的有效时间。在这个时间之前,浏览器可以使用这个资源的缓存副本。
- Location : 用于重定向响应中说明重定向的目标。
- Pragma : 用于向浏览器传送缓存指令。
- Server : 提供所使用的的Web服务器软件的相关信息。
- Set-Cookie : 向浏览器发送cookie,浏览器会在随后的请求中返回给服务器。
- WWW-Authenticate : 这个消息头用在状态码401的响应中,提供与服务器所支持的身份验证类型有关的信息。
- X-Frame-Options : 指示浏览器是否以及应该如何加载当前响应。
HTTP方法:
GET:获取资源。
POST:执行操作。
HEAD:检查某一资源在向其提交GET请求前是否存在。
TRACE:检测服务器与客户端之间是否存在任何操纵请求的代理服务器。
OPTIONS :要求服务器报告对某一特殊资源有效的HTTP方法。
PUT:使用包含在请求主体中的内容,向服务器上传指定的资源。
URL(统一资源定位符):
Web资源的唯一标识符,通过它获取其标识的资源。
REST(表述性状态转移):
分布式系统的一种体系构架。
编码方案
- URL编码:只允许使用ASCII码代码在0x20~0x7e中的字符,任何URL编码的字符都要以%为前缀。如:%3d表示‘=’;%25表示‘%’;%20表示空格......
- Unicode编码:和URL编码类似,以%u为前缀,其后也是十六进制的码点。如%u2215表示 ‘ / ’ 。UTF-8是一种长度可变的编码标准,它可以用一个或几个字节表示每个字符,它的多字节字符也是用%作为前缀。如%c%a9。主要用来破坏输入确认机制。
- HTML编码:他定义了大量HTML实体来表示特殊的字面量字符,如:"表示 " &apos表示 ' &表示 & 。并且任何字符都可以用它的十进制或十六进制进行编码。如"表示 " ,#39表示 ' ,用十六进制时要用x作为前缀。
- Base64编码:常用于对电子邮件附件进行编码。它将输入数据转换成3个字节块,每个块被划分为4段,每段六个数据位。这六个数据位有64种不同的排列组合,Base64编码字符集中只包含可打印的ASCII字符。如果输入的数据块不能构成3段输出数据,那么每个数据段就用=来补足。
- 十六进制编码:很多应用程序传送二进制数据是直接使用十六进制编码,用ASCII字符表示十六进制数据块。如daf进行十六进制编码会得到:646166
问题:
- OPTIONS方法有什么作用?答:要求服务器报告对某一资源有效的HTTP方法。
- If-Modified-Since和If-None-Match消息头的作用是什么?它们为何引起攻击者的注意?答:前者用于说明浏览器最后一次所收到请求资源的时间,后者指定一个实体标签,当最后一次收到所请求的资源时,浏览器提交服务器发布的实体标签,服务器可以使用实体标签确定浏览器是否有使用资源的缓存副本。
- 当服务器设置cookie时,secure标签有什么意义?答:设置这个属性,浏览器将仅在HTTPS中提交cookie。
- 常用状态码301与302有什么不同?答:301永久将浏览器重定向到另外一个在Location消息头中指定的URL。以后客户端应使用新的URL,而302是暂时的,在随后的请求中恢复使用原始URL。