cookie的介绍和使用

一、什么是cookie

  是由服务器端生成,发送给客户端(一般指浏览器),浏览器将cookie以键值对的形式保存到某个目录下的文本文件内。下次请求该网站时就把cookie发送回服务器。(cookie就是一个小文件,浏览器对其大小一般限制在4k,用来记录一些信息(一般用作标识))

二、cookie的作用

  web应用程序是使用Http协议传输数据的,而Http协议是无状态的,一旦数据交换完成就会断开连接,再次交换就要重新建立连接,此时,服务器并不知道该浏览器与自己进行过数据交互。浏览器在发送请求后,服务器除了正常的响应之外,会在响应头里加入一个set-cookie:id=XXX,浏览器接收之后会存入本地文档(txt),下次向该服务器发送请求时,会附带此cookie.

三、cookie的生命周期

  Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了(不排除用户手工删除Cookie)。而还有一些Cookie在用户退出会话的时候就被删除了,这样可以有效保护个人隐私。Cookie在生成时就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除Cookie,不会记录用户信息,更加安全。

四、cookie的特点

  1.需要遵循浏览器的同源策略(两个网站即使根域名相同,端口或者子域名不同,那这两个网站就分别拥有自己的cookie,并且不能互相操作)

  2.内存大小有限制(每个浏览器对其个数的限制不相同,每个域名在20~50之间,大小一般都限制在4K)

  3.cookie的安全性较低,存储的数据容易被窃取

五、cookie的安全性问题及其解决方案

  1.cookie欺骗

    攻击者在拿到cookie后可以通过模拟身份验证,将该cookie向服务器提交,冒充该cookie的拥有者访问网站窃取用户信息。

  2.cookie截获

    cookie以纯文本的形式在浏览器和服务器之间传递,在web通信时极容易被非法用户截获和利用。非法用户截获cookie后,在cookie的有效时间内重新发放给服务器,那么这个非法用户就拥有了这个合法用户的所有权限。

  3.Flash的内部代码

    Flash中有一个getURL()函数,Flash利用它自动打开指定的页面。那么这个就意味着,你在观看Flash动画时,在Flash的内部可以悄无声息的打开一个极小的不易发现的包含特殊操作的页面,可以是木马,可以向远端输入当前cookie或者用户信息,这是非常危险的,由于这个是Flash内部的操作,所以网站无法禁止,要想避免,尽量打开本地防火墙以及访问正规网站。

  4.解决方案

    (1)设置cookie有效期不要太长

    (2)设置HttpOnly属性为true,可以防止js脚本读取cookie信息,有效的防止XSS攻击

    (3)设置复杂的cookie,进行加密(例如:cookie的key使用uuid,随机生成,cookie的value使用复杂组合,用户名+当前时间+有效时间+随机数)

    (4)验证token,每次请求,都去将当前cookie和ip组合起来加密后的token与保存的token作对比,只有完全对应才能验证成功。

    (5)sessionId虽然放在cookie中,但是相对的session更安全,可以将相对重要的信息存入session。

    注:浏览器第一次请求服务器时,服务器会生成一个session,并返回给浏览器,这个sessionId会被保存在浏览器的会话cookie中。session在服务器的默认有效时间是30分钟。

    (6)使用https,如果网站支持https,那么可以为cookie设置Secure属性为true,它的意思是,cookie只能使用https协议发送给服务器,而https比http更加安全。

六、cookie的使用

 JS版本
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]; } } } // 默认情况下只能删除默认路径中保存的cookie, 如果想删除指定路径保存的cookie, 那么必须在删除的时候指定路径才可以 function delCookie(key, path) { addCookie(key, getCookie(key), -1, path); }

JQ版本
(function ($, window) {
    $.extend({
        addCookie: function (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+";";
            }
        },
        getCookie:function (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];
                }
            }
        },
        delCookie:function (key, path) {
            addCookie(key, getCookie(key), -1, path);
        }
    });
})(jQuery, window);
Tags: