关于cookies:cookie常见属性及用法

[导读]当设置为true时,示意创立的 Cookie 会被以平安的模式向服务器传输,也就是只能在 HTTPS 连贯中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连贯则不会传递该信息,所以不会被窃取到Cookie 的具体内容。 一、Cookie罕用属性一个Cookie蕴含以下信息:1)Cookie名称,Cookie名称必须应用只能用在URL中的字符,个别用字母及数字,不能蕴含特殊字符,如有特殊字符想要转码。如js操作cookie的时候能够应用escape()对名称转码。2)Cookie值,Cookie值同理Cookie的名称,能够进行转码和加密。3)Expires,过期日期,一个GMT格局的工夫,当过了这个日期之后,浏览器就会将这个Cookie删除掉,当不设置这个的时候,Cookie在浏览器敞开后隐没。4)Path,一个门路,在这个门路上面的页面才能够拜访该Cookie,个别设为“/”,以示意同一个站点的所有页面都能够拜访这个Cookie。5)Domain,子域,指定在该子域下才能够拜访Cookie,例如要让Cookie在a.test.com下能够拜访,但在b.test.com下不能拜访,则可将domain设置成a.test.com。6)Secure,安全性,指定Cookie是否只能通过https协定拜访,个别的Cookie应用HTTP协定既可拜访,如果设置了Secure(没有值),则只有当应用https协定连贯时cookie才能够被页面拜访。7)HttpOnly,如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无奈读取到Cookie信息。 留神:上图为在w3shool上为setcookie语法,并没有显示7 httponly哦,各自版本反对问题。 一、属性阐明:1 secure属性当设置为true时,示意创立的 Cookie 会被以平安的模式向服务器传输,也就是只能在 HTTPS 连贯中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连贯则不会传递该信息,所以不会被窃取到Cookie 的具体内容。2 HttpOnly属性如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无奈读取到Cookie信息,这样能无效的避免XSS攻打。 二、各种浏览器查看cookie办法示例:批改《web攻打之一:XSS跨站脚本》里的示例一里减少如下红色背景的代码如下: package com.dxz.web.controller;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.servlet.ModelAndView;@Controllerpublic class loginController { @RequestMapping(value="/login",method=RequestMethod.GET) public ModelAndView helloWorld(@RequestParam("nick") String nick, HttpServletResponse response){ System.out.println(nick + " login"); ModelAndView mv = new ModelAndView(); mv.addObject("message", nick); mv.setViewName("xss2"); Cookie hit=new Cookie("hitCounter","1"); hit.setHttpOnly(true);//如果设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法访问该Cookie hit.setMaxAge(60*60);//设置生存期为1小时 //hit.setDomain("www.duanxz.cn");//子域,在这个子域下才能够拜访该Cookie //hit.setPath("/hello");//在这个门路上面的页面才能够拜访该Cookie //hit.setSecure(true);//如果设置了Secure,则只有当应用https协定连贯时cookie才能够被页面拜访 response.addCookie(hit); return mv; }}再拜访 http://localhost:8080/SpringWebTraining/login?nick=%22%2F%3Cscript%3Ealert%28%22haha%22%29%3C%2Fscript%3E%3C%21- IE11: ...

July 20, 2021 · 2 min · jiezi

关于cookies:chrome-iframe-cookies设置失败

前言 新版Chrome减少了一个性能 SameSite,能够禁止iframe设置cookies。 如果咱们在iframe中须要登录验证,那就比拟麻烦。能够通过禁用这个性能解决。 例子 浏览器控制台提醒: A cookie associated with a cross-site resource at http://58.211.78.91/ was set without the `SameSite` attribute. It has been blocked, as Chrome now only delivers cookies with cross-site requests if they are set with `SameSite=None` and `Secure`. You can review cookies in developer tools under Application>Storage>Cookies and see more details at https://www.chromestatus.com/... and https://www.chromestatus.com/... 如果浏览器中提醒以上内容,而且iframe中的申请中,呈现以下状况: 根本能够确定是_SameSite的问题。_ 解决 Chrome拜访 chrome://flags/ ,搜寻_SameSite,找到SameSite by default cookies,这是为Disabled,即可:_ ...

August 14, 2020 · 1 min · jiezi

如何给localStorage设置一个过期时间?

引言 这个话题其实在上次分享<小程序填坑记里讲过了>已经讲过(大佬可绕过哦~),但后来群里/评论都有些同学,提到了一些疑问,问能否单独整理一篇更为详细的分享,讲解一下细节和完善提到的不足,如是有了下文????。 —— 「 用心分享 做有温度的攻城狮,我是首席填坑官——苏南 」各位大佬早安,这里是@IT·平头哥联盟,我是首席填坑官∙苏南,用心分享 做有温度的攻城狮。公众号:honeyBadger8,群:912594095思考点 从我们接触前端起,第一个熟悉的存储相关的Cookie或者来分析我们生活中密切相关的淘宝、物流、闹钟等事物来说起吧,Cookie从你设置的时候,就会给个时间,不设置默认会话结束就过期;淘宝购物 从你下单付款起,就会给这件货物设置一个收货期限时间,过了这个时间自动认为你收货(即订单结束);闹钟 你设置的提醒时间,其实也就是它的过期时间;再比如与您每天切身相关的产品需求,过完需求,你给出的上线时间,也就是这个需求的过期时间;再通俗点讲,您今年的生日过完到明年生日之间也是相当于设置了有效期时间;以上种种,我们能得出一个结论任何一件事、一个行为动作,都有一个时间、一个节点,甚至我们可以黑localStorage,就是一个完善的API,为什么不能给一个设置过期的机制,因为sessionStorage、Cookie并不能满足我们实际的需求。实现思路 抱歉,黑localStorage不完善,有点夸张了,综合上述的总结,问题就简单了,给localStorage一个过期时间,一切就都so easy ?到底是不是,来看看具体的实现吧:简单回顾//示例一:localStorage.setItem(’test’,1234567);let test = localStorage.getItem(’test’);console.log(typeof test, test); //示例二:localStorage[’name’] = ‘苏南’;console.log(localStorage[’name’]);/输出:“1234567” ,‘苏南’,这里要注意,1234567 存进去时是number 取出来就成string了/重写 set(存入) 方法:首先有三个参数 key、value、expired ,分别对应 键、值、过期时间,过期时间的单位可以自由发挥,小时、分钟、天都可以,注意点:存储的值可能是数组/对象,不能直接存储,需要转换 JSON.stringify,这个时间如何设置呢?在这个值存入的时候在键(key)的基础上扩展一个字段,如:key+’expires’,而它的值为当前 时间戳 + expired过期时间具体来看一下代码 :set(key, value, expired) { /* * set 存储方法 * @ param {String} key 键 * @ param {String} value 值, * @ param {String} expired 过期时间,以分钟为单位,非必须 * @ 由@IT·平头哥联盟-首席填坑官∙苏南 分享,交流:912594095 / let source = this.source; source[key] = JSON.stringify(value); if (expired){ source[${key}__expires__] = Date.now() + 100060expired }; return value;}重写 get(获取) 方法:获取数据时,先判断之前存储的时间有效期,与当前的时间进行对比;但存储时expired为非必须参数,所以默认为当前时间+1,即长期有效;如果存储时有设置过期时间,且在获取的时候发现已经小于当前时间戳,则执行删除操作,并返回空值;注意点:存储的值可能是数组/对象,取出后不能直接返回,需要转换 JSON.parse,具体来看一下代码 :get(key) { / * get 获取方法 * @ param {String} key 键 * @ param {String} expired 存储时为非必须字段,所以有可能取不到,默认为 Date.now+1 * @ 由@IT·平头哥联盟-首席填坑官∙苏南 分享,交流:912594095 / const source = this.source, expired = source[${key}__expires__]||Date.now+1; const now = Date.now(); if ( now >= expired ) { this.remove(key); return; } const value = source[key] ? JSON.parse(source[key]) : source[key]; return value;}重写 remove(删除) 方法:删除操作就简单了,;remove(key) { const data = this.source, value = data[key]; //首席填坑官∙苏南的专栏 delete data[key]; delete data[${key}__expires__]; return value;}优化点:记得上次有个同学,是这么评论的:「 删除缓存能放到constructor里面执行么,放到get里面 不取就一直在那是不是不太好?」;所以本次优化做一个初始化删除操作,清除已经过期的数据;为什么不用for in而是 for ? for in循环遍历对象的属性时,原型链上的所有属性都将被访问,解决方案:使用hasOwnProperty方法过滤或Object.keys会返回自身可枚举属性组成的数组;class storage { constructor(props) { this.props = props || {} this.source = this.props.source || window.localStorage this.initRun(); } initRun(){ / * set 存储方法 * @ param {String} key 键 * @ param {String} value 值,存储的值可能是数组/对象,不能直接存储,需要转换 JSON.stringify * @ param {String} expired 过期时间,以分钟为单位 * @ 由@IT·平头哥联盟-首席填坑官∙苏南 分享,交流:912594095 */ const reg = new RegExp("expires"); let data = this.source; let list = Object.keys(data); if(list.length > 0){ list.map((key,v)=>{ if( !reg.test(key )){ let now = Date.now(); let expires = data[${key}__expires__]||Date.now+1; if (now >= expires ) { this.remove(key); }; }; return key; }); }; }}总结: 以上就是今天为大家总结的分享,您GET到了吗?小程序、sessionStorage、localStorage,都适用,做些许调整即可哦,希望今天的分享能给您带来些许成长,如果觉得不错,记得关注下方公众号哦,每周第一时间为您推最新分享????????。更多文章:easy-mock 最好的备胎没有之一immutability因React官方出镜之使用总结分享!面试踩过的坑,都在这里了~你应该做的前端性能优化之总结大全!如何给localStorage设置一个过期时间?动画一点点 - 如何用CSS3画出懂你的3D魔方?作者:苏南 - 首席填坑官链接:https://blog.csdn.net/weixin_…交流:关注公众号邀请您加入交流群 honeyBadger8本文原创,著作权归作者所有。商业转载请联系@IT·平头哥联盟获得授权,非商业转载请注明原链接及出处。 ...

November 15, 2018 · 2 min · jiezi

以登录注册理解Cookie的作用过程

这篇文章是前一篇文章(Cookie理论知识)的实践性理解完整代码:完整代码Cookie在注册登录时的作用过程:注册注册时把账号密码写入数据库登录第一次登录时服务器给浏览器发送Cookie.后台的登录路由代码(nodejs):else if (path === ‘/sign_in’ && method === ‘POST’) { readBody(request).then((body) => { let strings = body.split(’&’) // [’email=1’, ‘password=2’, ‘password_confirmation=3’] let hash = {} strings.forEach((string) => { // string == ’email=1’ let parts = string.split(’=’) // [’email’, ‘1’] let key = parts[0] let value = parts[1] hash[key] = decodeURIComponent(value) // hash[’email’] = ‘1’ }) let { email, password } = hash var users = fs.readFileSync(’./db/users’, ‘utf8’) try { users = JSON.parse(users) // [] } catch (exception) { users = [] } let found for (let i = 0; i < users.length; i++) { if (users[i].email === email && users[i].password === password) { found = true break } } if (found) {//关键在这里,验证成功,设置登录Cookie为登录的邮箱,并放在响应里发给浏览器 response.setHeader(‘Set-Cookie’, sign_in_email=${email}) response.statusCode = 200 } else { response.statusCode = 401 } response.end() }) }在登录成功的一瞬间,需要后台设置一个Cookie,记录一下登陆的用户id(这里用邮箱表示,代码在上面),然后发响应给浏览器例如在服务器端设置响应头:set-cookies:user_email=1@mtt.com这时候我们查看响应:发现响应头已经设置cookie.然后跳转到主页,这时候我们查看跳转到主页的请求:发现跳转到主页的请求头中包含cookie字段(以后访问这个域名都会带着这个Cookie)!所以,就像上篇文章说的:如果服务器给了浏览器一个setcookie的响应头,那么这个浏览器以后所有的请求,只要是相同的源(即就是上次给我发送Cookie的那个域名,域名和端口相同),那就么就会把当时服务器发给这个浏览器的Cookie带着以后,浏览器一旦访问这个路径,浏览器就会附上这段 Cookie 发送给服务器即:第一次请求,服务器为浏览器设置Cookie.下次请求,浏览器带上Cookie,发送给服务器.第一次登录的时候,服务器给浏览器的响应设置一个Cookie,set-cookies:user_email=1@mtt.com,然后当浏览器下次进行请求的时候,发现Cookie中有名为User_email的Cookie,而且我发送请求的域名还是上次发给我带Cookie的响应的那个域名.那么就无需再次登录了.相当于服务器给浏览器发了进入门票,下次或下下次浏览器在进入服务器的时候给服务器看票就可以了后台读取Cookie保留登录状态与删除Cookie退出登录状态首页代码:<body> <h1>我是首页</h1> <div class=""> <a href="./sign_up">注册</a> <a href="./sign_in">登录</a> </div> <h1>你的状态是:status</h1> <h1>你的邮箱账号是:email</h1> <h1>你的密码是:password</h1> <a href=“javascript:;” id=“logOffBtn”>退出登录(删除cookie)</a></body><script>logOffBtn.addEventListener(“click”, () => { // 删除一个现存 Cookie 的唯一方法,是设置它的expires属性为一个过去的日期。 document.cookie = ‘sign_in_email=;expires=Thu, 01-Jan-1970 00:00:01 GMT’ window.location = “/” })</script>后台路由代码if (path === ‘/’) { response.statusCode = 200 let string = fs.readFileSync(’./index.html’) string = string.toString(); var users = fs.readFileSync(’./db/users’, ‘utf8’) users = JSON.parse(users)//转化为user对象数组 console.log(users); let cookies = request.headers.cookie || ‘’//[’email=111’, ‘asdasd=111’] cookies = cookies.split("; “) let hash={} cookies.forEach((string)=>{ let parts = string.split("=”) let key = parts[0] let value = parts[1] hash[key] = value; }) let eamil = hash.sign_in_email let foundedUser users.forEach((userObj)=>{ if(userObj.email===eamil){ foundedUser = userObj; } }) console.log(foundedUser); if(foundedUser){ string = string.replace(’status’, ‘已登录’) string = string.replace(’email’, foundedUser.email) string = string.replace(’password’, foundedUser.password) }else{ string = string.replace(’status’, ‘未登录,请去登录’) string = string.replace(’email’, ‘没’) string = string.replace(’password’, ‘没’) } response.setHeader(‘Content-Type’, ’text/html;charset=utf-8’) response.write(string) response.end() }在没有Cookie的时候,首页的状态登录之后,后台根据Cookie查询数据库,将用户名与密码传到前台的首页上退出登录将删除Cookie并刷新页面,重新回到未登录的状态Cookie在登录的时候的特点我们得到Cookie的特点:第一次登录的时候,服务器通过 Set-Cookie 响应头设置 Cookie,然后以响应的形式发给浏览器浏览器得到 响应中Cookie 之后,之后每次请求这个域名都要带上这个 Cookie之后服务器读取当时自己设置的 Cookie 就知道登录用户的信息(email)几个关于Cookie的问题1.我在 Chrome 登录了得到 Cookie,用 Safari 访问,Safari 会带上 Cookie 吗no2.Cookie 存在哪Windows 存在 C 盘的一个文件里3.Cookie会被用户篡改吗?可以,例如在谷歌浏览器开发者模式下的application->Cookie中可以手动修改,修改之后,下次发送请求时,附带的就是修改后的CookieJS中也有可以操作cookie的api( 假如换成别的用户的账号,那么还可以登录成功的话,就会存在风险问题.Session 来解决这个问题,防止用户篡改)后端可以强制设置不允许修改Cookie,只要将Cookie的属性设置为Httponly即可(还可以手动改,但是JS改不了,也无法获取),具体语法看 MDN4.Cookie 有效期吗?默认有效期20分钟左右,不同浏览器策略不同(如果浏览器一直开着,那么Cookie不会被删除.如果关闭浏览器,那么浏览器为了安全考虑,20分钟左右后可能会删除Cookie.这也取决于服务器如何设置Cookie的有效期)后端可以强制设置有效期,具体语法看 MDNCookie 遵守同源策略吗?也有,不过跟 AJAX 的同源策略稍微有些不同。当请求 qq.com 下的资源时,浏览器会默认带上 qq.com 对应的 Cookie,不会带上 baidu.com 对应的 Cookie当请求 v.qq.com 下的资源时,浏览器不仅会带上 v.qq.com 的Cookie,还会带上 qq.com 的 Cookie另外 Cookie 还可以根据路径做限制,请自行了解,这个功能用得比较少。需要注意的细节问题为什么前后端都要进行表单验证?前后端都要验证邮箱格式是否正确,账号密码格式是否正确,两次提交的密码是否相同等。因为黑客可以绕过前端的js验证流程,例如黑客可以直接使用curl 进行请求的发送,直接与后台服务器进行交互。如图:所以后台也需要进行表单验证。Cookie如何手动关闭翻译cookie:曲奇饼cache-control:缓存控制 ...

October 4, 2018 · 2 min · jiezi

以登录注册理解Cookie的作用过程

这篇文章是前一篇文章(Cookie理论知识)的实践性理解完整代码:完整代码Cookie在注册登录时的作用过程:注册注册时把账号密码写入数据库登录第一次登录时服务器给浏览器发送Cookie.后台的登录路由代码(nodejs):else if (path === ‘/sign_in’ && method === ‘POST’) { readBody(request).then((body) => { let strings = body.split(’&’) // [’email=1’, ‘password=2’, ‘password_confirmation=3’] let hash = {} strings.forEach((string) => { // string == ’email=1’ let parts = string.split(’=’) // [’email’, ‘1’] let key = parts[0] let value = parts[1] hash[key] = decodeURIComponent(value) // hash[’email’] = ‘1’ }) let { email, password } = hash var users = fs.readFileSync(’./db/users’, ‘utf8’) try { users = JSON.parse(users) // [] } catch (exception) { users = [] } let found for (let i = 0; i < users.length; i++) { if (users[i].email === email && users[i].password === password) { found = true break } } if (found) {//关键在这里,验证成功,设置登录Cookie为登录的邮箱,并放在响应里发给浏览器 response.setHeader(‘Set-Cookie’, sign_in_email=${email}) response.statusCode = 200 } else { response.statusCode = 401 } response.end() }) }在登录成功的一瞬间,需要后台设置一个Cookie,记录一下登陆的用户id(这里用邮箱表示,代码在上面),然后发响应给浏览器例如在服务器端设置响应头:set-cookies:user_email=1@mtt.com这时候我们查看响应:发现响应头已经设置cookie.然后跳转到主页,这时候我们查看跳转到主页的请求:发现跳转到主页的请求头中包含cookie字段(以后访问这个域名都会带着这个Cookie)!所以,就像上篇文章说的:如果服务器给了浏览器一个setcookie的响应头,那么这个浏览器以后所有的请求,只要是相同的源(即就是上次给我发送Cookie的那个域名,域名和端口相同),那就么就会把当时服务器发给这个浏览器的Cookie带着以后,浏览器一旦访问这个路径,浏览器就会附上这段 Cookie 发送给服务器即:第一次请求,服务器为浏览器设置Cookie.下次请求,浏览器带上Cookie,发送给服务器.第一次登录的时候,服务器给浏览器的响应设置一个Cookie,set-cookies:user_email=1@mtt.com,然后当浏览器下次进行请求的时候,发现Cookie中有名为User_email的Cookie,而且我发送请求的域名还是上次发给我带Cookie的响应的那个域名.那么就无需再次登录了.相当于服务器给浏览器发了进入门票,下次或下下次浏览器在进入服务器的时候给服务器看票就可以了后台读取Cookie保留登录状态与删除Cookie退出登录状态首页代码:<body> <h1>我是首页</h1> <div class=""> <a href="./sign_up">注册</a> <a href="./sign_in">登录</a> </div> <h1>你的状态是:status</h1> <h1>你的邮箱账号是:email</h1> <h1>你的密码是:password</h1> <a href=“javascript:;” id=“logOffBtn”>退出登录(删除cookie)</a></body><script>logOffBtn.addEventListener(“click”, () => { // 删除一个现存 Cookie 的唯一方法,是设置它的expires属性为一个过去的日期。 document.cookie = ‘sign_in_email=;expires=Thu, 01-Jan-1970 00:00:01 GMT’ window.location = “/” })</script>后台路由代码if (path === ‘/’) { response.statusCode = 200 let string = fs.readFileSync(’./index.html’) string = string.toString(); var users = fs.readFileSync(’./db/users’, ‘utf8’) users = JSON.parse(users)//转化为user对象数组 console.log(users); let cookies = request.headers.cookie || ‘’//[’email=111’, ‘asdasd=111’] cookies = cookies.split("; “) let hash={} cookies.forEach((string)=>{ let parts = string.split("=”) let key = parts[0] let value = parts[1] hash[key] = value; }) let eamil = hash.sign_in_email let foundedUser users.forEach((userObj)=>{ if(userObj.email===eamil){ foundedUser = userObj; } }) console.log(foundedUser); if(foundedUser){ string = string.replace(’status’, ‘已登录’) string = string.replace(’email’, foundedUser.email) string = string.replace(’password’, foundedUser.password) }else{ string = string.replace(’status’, ‘未登录,请去登录’) string = string.replace(’email’, ‘没’) string = string.replace(’password’, ‘没’) } response.setHeader(‘Content-Type’, ’text/html;charset=utf-8’) response.write(string) response.end() }在没有Cookie的时候,首页的状态登录之后,后台根据Cookie查询数据库,将用户名与密码传到前台的首页上退出登录将删除Cookie并刷新页面,重新回到未登录的状态Cookie在登录的时候的特点我们得到Cookie的特点:第一次登录的时候,服务器通过 Set-Cookie 响应头设置 Cookie,然后以响应的形式发给浏览器浏览器得到 响应中Cookie 之后,之后每次请求这个域名都要带上这个 Cookie之后服务器读取当时自己设置的 Cookie 就知道登录用户的信息(email)几个关于Cookie的问题1.我在 Chrome 登录了得到 Cookie,用 Safari 访问,Safari 会带上 Cookie 吗no2.Cookie 存在哪Windows 存在 C 盘的一个文件里3.Cookie会被用户篡改吗?可以,例如在谷歌浏览器开发者模式下的application->Cookie中可以手动修改,修改之后,下次发送请求时,附带的就是修改后的CookieJS中也有可以操作cookie的api( 假如换成别的用户的账号,那么还可以登录成功的话,就会存在风险问题.Session 来解决这个问题,防止用户篡改)后端可以强制设置不允许修改Cookie,只要将Cookie的属性设置为Httponly即可(还可以手动改,但是JS改不了,也无法获取),具体语法看 MDN4.Cookie 有效期吗?默认有效期20分钟左右,不同浏览器策略不同(如果浏览器一直开着,那么Cookie不会被删除.如果关闭浏览器,那么浏览器为了安全考虑,20分钟左右后可能会删除Cookie.这也取决于服务器如何设置Cookie的有效期)后端可以强制设置有效期,具体语法看 MDNCookie 遵守同源策略吗?也有,不过跟 AJAX 的同源策略稍微有些不同。当请求 qq.com 下的资源时,浏览器会默认带上 qq.com 对应的 Cookie,不会带上 baidu.com 对应的 Cookie当请求 v.qq.com 下的资源时,浏览器不仅会带上 v.qq.com 的Cookie,还会带上 qq.com 的 Cookie另外 Cookie 还可以根据路径做限制,请自行了解,这个功能用得比较少。需要注意的细节问题为什么前后端都要进行表单验证?前后端都要验证邮箱格式是否正确,账号密码格式是否正确,两次提交的密码是否相同等。因为黑客可以绕过前端的js验证流程,例如黑客可以直接使用curl 进行请求的发送,直接与后台服务器进行交互。如图:所以后台也需要进行表单验证。Cookie如何手动关闭翻译cookie:曲奇饼cache-control:缓存控制 ...

October 2, 2018 · 2 min · jiezi