我们在登录网站时,常常有一个“记住我”的选项,给它打上勾,下次就能免密登录了,这是怎么实现的呢🤔
解答这个问题之前,我们需要先了解HTTP。
HTTP的请求方式
常用的:
GET:请求从服务器获取资源
HEAD:类似于GET请求,只不过不会返回实体数据,只获取表头
POST:服务器提交数据
PUT:替换服务器的内容
不常用的:
DELETE:请求服务器删除指定的资源
TRACE:对链路进行测试或诊断
OPTIONS:列出可对资源实行的操作方法,Allow字段里返回
CONNECT:要求服务器和另一台服务器建立连接,充当代理
其他:MKCOL、COPY、MOV、LOCK、PATCH等
最常见的还是GET和POST
GET方法的作用在于获取资源。它可以用于URL查询字符串的形式向所请求的资源发送参数。这使用户可将一个包含动态资源的URL标注为书签,用户自己或其他用户随后可重复利用该书签来获取等价的资源(作用与标注为书签的搜索查询相似)。URL会带有请求的内容,显示在屏幕上(即浏览器地址栏内),并被记录在许多地方,如浏览器的历史记录和Web服务器的访问日志中。如果单击外部链接,还可以用Referer消息头将它们传送到其他站点。因此,请勿使用查询字符传送任何敏感信息。
POST方法的主要作用是执行操作。使用这个方法可以在URL查询字符申与消息主体中发送请求参数。尽管仍然可以将URL标注为书签,但书签中并不包含消息主体发送的任何参数。许多维护URL日志的位置及Referer消息头也将这些参数排除在外。因为POST方法旨在执行操作,如果用户单击浏览器上的“后退”按钮,返回一个使用这种方法访问的页面,那么浏览器不会自动重新发送请求,而是就即将发生的操作向用户发出带告。这样做可防止用户无意中多次执行同一个操作。因此,在执行一些操作时必须使用POST请求。
HTTP请求
每个HTTP请求的第一行由3个以空格间隔的项目组成,分别是请求方式、请求URL、HTTP协议版本。
Accept表示浏览器支持的 MIME 类型;
关于MIME类型可见blog.csdn.net/huahao1989/article/details/107746738
Referer指从哪个URL发出的请求,或者说是从哪里跳转过来的。
Accept-Language 后面跟浏览器所支持的语言
UserAgent是浏览器客户端软件相关的信息。另外再提一下,我在翻HTTP请求的时候,发现大多数浏览器都带这个Mozilla前缀,难道它们都跟火狐有什么牵连🤔,其实这是一个历史问题,可参考知乎用户码农翻身的回答:https://www.zhihu.com/question/19553117/answer/2900188991
Host消息头用于指定出现在被访问的完整URL中的主机名称。
Content-Length消息头规定消息主体的字节长度。
Connection表示持久的客户端与服务连接
Transfer-Encoding消息头指定为方便其通过HTTP传输而对消息主体使用的任何编码。如果使用这个消息头,通常是用它指定了编码
Cookie消息头用于提交服务器向客户端发布的其他参数
更多消息头含义可查询相关资料。
HTTP响应
每个HTTP响应的第一行由3个以空格间隔的项目组成,分别为HTTP协议版本、表示请求结果的数字状态码、一段文本形式的短语用于描述响应状态。
Server指明所使用的Web服务器软件。有时还包括其他信息,如所安装的模块和服务器操作系统。其中包含的信息可能并不准确
Content-Type消息头示这个消息主体中包含一个HTML文档。
Date表示消息发送的时间,缓存在评估响应的新鲜度时要用到。
关于状态码:
每条HTTP响应消息都必须在第一行中包含一个状态码,说明请求的结果。根据代码的第一位数字,可将状态码分为以下5类。
1xx -提供信息。
2xx—请求被成功提交。
3xx—客户端被重定向到其他资源。
4xx -请求包含某种错误。
5xx—服务器执行请求时遇到错误。
下面列出渗透测试员在攻击Web应用程序时最有可能遇到的状态码及其相关的原因短语。
100 Continue。当客户端提交一个包含主体的请求时.将发送这个响应。该响应表示已收到请求消息头.客户端应继续发送主体。请求完成后,再由服务器返回另一个响应。
200 Ok。本状态码表示已成功提交请求,且响应主体中包含请求结果。
201 Created. PUT请求的响应返回这个状态码,表示请求已成功提交。
301 Moved Permanently。本状态码将浏览器永久重定向到另外一个在Location消息头中指定的URL。以后客户端应使用新URL替换原始URL。
302 Found。本状态码将浏览器暂时重定向到另外一个在Location消息头中指定的URL.客户端应在随后的请求中恢复使用原始URL.
304 Not Modified。本状态码指示浏览器使用缓存中保存的所请求资源的副本。服务器使用If-Modified-Since与工f-None-Match消息头确定客户端是否拥有最新版本的资源。
400 Bad Request。本状态码表示客户端提交了一个无效的HTTP请求。当以某种无效的方式修改请求时(例如在URL中插人一个空格符),可能会遇到这个状态码。
401 Unauthorized.服务器在许可请求前要求HTTP进行身份验证。WWW-Authenticate消息头详细说明所支持的身份验证类型。
403 Forbidden。本状态码指出,不管是否通过身份验证,禁止任何人访问被请求的资源。
404 Not Found。本状态码表示所请求的资源并不存在。
405 Method Not Allowed。本状态码表示指定的URL不支持请求中使用的方法。例如,如果试图在不支持PUT方法的地方使用该方法,就会收到本状态码。
413 Request Entity Too Large。如果在本地代码中探查缓冲器滋出瀚洞并就此提交超长数据串.则本状态码表示请求主体过长,服务器无法处理。
414 Request URI Too Long。与前一个响应类似,本状态码表示请求中的URL过长,服务器无法处理。
500 Internal Server Error。本状态码表示服务器在执行请求时遇到错误。当提交无法预料的输人、在应用程序处理过程中造成无法处理的错误时,通常会收到本状态码。应该仔细检查服务器响应的所有内容,了解与错误性质有关的详情。
503 Service Unavailable。通常,本状态码表示尽管Web服务器运转正常.并且能够响应请求,但服务器访问的应用程序还是无法作出响应。应该进行核实,是否因为执行了某种行为而造成这个结果。
HTTP协议特点
请求应答模式。在HTTP早期的协议里面,如果客户端不去请求资源,服务器就不响应;在HTTP2.0版本里有了一个PUSH(推送)的模式,即是客户端不请求资源,服务器也可以主动推送资源。
灵活可扩展。能够传输非常丰富的内容
可靠传输。根据计算机网络的知识,HTTP是应用层的协议,工作在传输层之上,传输层的TCP/IP协议是可靠传输。
无状态(stateless)。每一次请求都是独立的。
无状态的特点会让网络访问变得复杂,一旦客户端和服务器的数据交换完毕,就会断开连接,再次请求,会重新连接,如果不采取有效的措施,每次操作都需要验证你的身份才能继续。我们需要保持这个会话,告诉网站这都是我自己的操作,不用反复地验证我的身份。解决这个问题,可以在用户第一次登陆后,下发一个表示其身份的标志,之后的每一次访问就带上这个标志就行了。这个身份标志就是cookie。这就解决了我们在文章开头提出的问题。
cookie和session
cookie是key/value格式,例如name=admin、id=1 等等。
Set-Cookie格式:name=value cookie的键值对(这是必须的)
Set-Cookie消息头还可包含以下任何可选属性,用它们控制浏览器处理cookie的方式。
expires cookie的过期时间,是年-月-日 几点几分的格式。
max-age cookie的有效时间(单位是秒),优先级比expires高(如果未设置cookie的过期/有效时间,cookie只能用于当前的浏览器会话中(关掉浏览器cookie就没了)
domain 用于指定cookie的有效域。这个域必须和收到cookie的域相同,或者是它的父域。
path cookie匹配的路径
secure 只在HTTPS连接中提交cookie
httponly 无法通过客户端JavaScript直接访问cookie(不允许通过脚本document.cookie去更改这个值)
登陆之后,收到的响应头内带有Set-Cookie消息头(由服务器下发给客户端),之后在规定时间之内在访问其它页面时的请求头内会带有该Cookie值(客户端发送给服务器),用于确认你的身份,从而实现保持会话,自动登录。
cookie是可以看的,它存放在浏览器网址栏里锁形状的icon里面。
如果未设置cookie的有效时间,cookie只能用于当前的浏览器会话中(关掉浏览器cookie就没了)
cookie的存储路径:
cookie的特点:明文、可修改、大小受限(视浏览器而定)
用途:记住登陆状态,跟踪用户行为
使用cookie时候,所有网站的cookie都会存在电脑本地,本地的cookie管理起来会很麻烦;每次访问网站的时候还会携带好多cookie值。还是有些麻烦
那就把相关内容存储在服务端,这个东西叫session,用ID标记
session不是cookie的替代,它是基于cookie发挥作用的