【前端安全】Cookies
2019-04-07 12:05
218 查看
Cookies的特征
- 前端数据的存储
- 后端通过http头设置
- 请求时通过http头传给后端
- 前端可读写
- 遵守同源策略
if(results.length){ let user = result[0]; //登录成功,设置cookie ctx.cookies.set('userId'. user.id, { httpOnly: false, sameSite: 'strict' }) }
Cookie不能覆盖 相当于追加
Cookies的特征
- 域名
- 有效期
- 路径
- http-only
- secure
用ID+签名:
var crypt = {}; const KEY = 'FSDKLJ@#$24SFD'; crypt.cryptUserId = function(userId) { var crypto = require('crypto'); var sign = crypto.createHmac('sha256', KEY); sign.update(userId + ' '); return sign.digest('hex')' } modules.exports = crypt;
ctx.cookies.set('userId', crypt.cryptUserId(userId), { httpOnly: false, sameSite: 'strict' )
签名不可逆
通过生成签名再通过计算ID和签名结合产生的正确的签名进行对比 看看是否是本人。
var userId = ctx.cookies.get('userId'); var sign = ctx.cookies.get('sign'); var correctSign = crypt.cryptUserId(userId); if(correctSign !== sign) { throw new Error('报告, 有人入侵'); }
SessionId
随机的字符串,相当于一把钥匙,登录派发一个id
var session = {}; var cache = {}; session.set = function (userId, obj) { var sessionId = Math.random(); if(!cache[sessionId]) { cache[sessionId] = {}; } cache[sessionId].content = obj; return sessionId; } session.get = function(userId) { return cache[uid] && cache[sessionId].content; } module.exports = session;
const session = require('../tools/session'); var sessionId = session.set(user.id, { userId: user.id }) ctx.cookies.set('sessionId', sessionId, { httpOnly: true, sameSite: 'strict' })
var sessionId = ctx.cookies.get('sessionId'); var sessionObj = session.get(sessionId); if(!sessionObj||!session.userId) { throw new Error('session不存在'); } var userId = sessionObj.userId;
Cookies和Xss的关系
- xss可能偷取Cookies(document.cookie可能被偷取)
- http-only的Cookie不会被偷
Cookies和CSRF的关系
- CSRF利用了用户Cookies
- 攻击站点无法读写Cookies
- 最好能阻止第三方使用Cookies
var crypto = require('crypto'); var KEY = 'sfdjkljl23423%@#$@#'; var cipher = crypto.createCipher('des', KEY); var text = cipher.update('hello word', 'utf-8', 'hex'); text += cipher.final('hex'); console.log('text'); var decipher = crypto.createDecipher('des', KEY); var originalText = decipher.update(text, 'hex', 'utf-8'); orginalText += decipher.final('utf-8'); console.log(originalText);
Cookies-安全策略
- 签名防篡改
- 私有变换(加密)
- http-only(防止xss)
- secure(只有https才行secure)
- same-site
Cookies的作用
- 存储个性化设置
- 存储未登录时用户唯一标识
- 存储已登录用户的凭证
- 存储其他业务数据
Cookies-登录用户凭证
- 前端提交用户名和密码
- 后端验证用户名和密码
- 后端通过HTTP头设置用户凭证
- 后续访问时后端先验证用户凭证
相关文章推荐
- [Web前端]由cookies安全说开去
- 【WEB前端】COOKIES与SESSION的区别
- 前端安全问题
- 前端冷知识集锦,很多都是web安全能用到的小技巧
- 前端安全攻防小结
- cookies安全问题
- 前端安全之XSS攻击
- magento nginx 在前端使用安全 URL 问题
- 【前端安全】JavaScript防http劫持与XSS
- 前端也应关注安全
- 前端安全问题
- 确保安全的HTTPS(对HTTP加密的几种技术,前端面试常问)第一篇
- 微博前端的安全
- (转)前端安全之XSS攻击
- 站点的安全防范都是后端的职责?非也,Web前端安全同样不可忽视
- 前端的安全问题?
- 前端学习,优化,安全
- 前端安全配置之Content-Security-Policy(csp)
- web 前端安全问题
- web前端安全编码(模版篇)