你会发现, 只要登录的时候勾选上这个框框(ps: 你的提示文字最好使用label+for), 即使你关闭浏览器再重新打开还是"已经登录的状态", 可能你也知道, 大多网站都是用session记录标识, 因为使用cookie记录不太安全, 可以被伪造, 那么session关闭浏览器会清空, 那还乍的记录标识呢? 嘎嘎, 接着往下看
session+cookie验证登录
大概的思路是在登录成功后, 记录session标识, 并根据相关参数写入cookie, 当然不会包含重要信息, 每次用户刷新页面, 会进行session判定, 如果没有, 则进行cookie判定, 如果正确则查库并写入session,大概伪代码是这样的:
每个页面初始化
开启session;
if(session存在){
//已经登录
} else {
if(指定cookie存在){
//解密cookie
if(匹配成功){
//查询数据库
if(有这个用户){
//写入session, 这里是否还用更新cookie信息你说了算
} else {
//假的也想进我的站?
}
} else {
//小样, 还想伪造 cookie? 嘎嘎
}
} else {
//这里认为没有登录
}
}
//这里已经知道用户登录的状态了
登录页面埋点
开启session;
if(各种表单验证通过){
//写入session, 并提取uid,uname等不敏感信息再加自己的密钥生成唯一的token码, 用base64方式写入cookie, 这里为了让重启浏览器或者session过期后使用
}
但是你有没有发现, 如果为一个正常的用户, 在没有登录状态下, 上面初始化代码会在每个页面进行判定, 感觉不太帅, 且可能被别人伪造cookie, 如果站内涉及到$方面的事就更不好了, 于是改之:
session分权限等级方式
我们设置session标识, 0为未登录, 1为已登录, 2为cookie方式登录(这样就可以针对这样的用户进行再次验证), 然后我们需要改我们的伪代码.
页面初始化
开启session;
if(session存在){
if(session > 0){
//如果>0则说明已登录
} else {
//这里说明没有登录, 这个状态码是cookie验证没通过时留下的
}
} else {
//这里验证session不存在, 但可能cookie存在, 所以需要验证
if(cookie存在){
//这里进行解密
if(成功){
//查数据库
if(成功){
//session = 2, 为啥=2? 因为打上标识说明这次的登录方式是使用cookie验证登录的, 以方便在进行安全操作的时候再次验证
} else {
// session = 0
}
} else {
//session = 0
}
} else {
//cookie不存在的话视为没有登录, 这里把session标识 = 0, 以方便下次验证
}
}
登录页面埋点
开启session;
if(各种表单验证通过){
// session = 1, 打上标识说明是正常登录方式, 并生成token存入cookie以便下次使用
}
重要操作时再次验证, 比如: 交易等
开启session;
if(session===2){
//弹出登录层 或者 跳转到登录页面再次验证, 是不是觉得跟taobao.com很像, 嘎嘎
}
致此验证完比, 当然实际使用哪种方式对token进行加密视项目情况而定, 但建议别使用敏感信息, 因为cookie你懂的...
你可能会想到这些问题
问: 清空cookie后这种方式就不行了?
答: 是的, 目前再主流的站, 只要你把缓存清空, 这里缓存包括任何, 比如 cookie, localStorage, sessionStorage, userDB, Web SQL, IndexdDB等, 你再重启浏览器, 我就不信你还是登录状态...(ps: 什么, 真的还是? 请留言反馈给我, 谢谢)
问: 这样岂不是知道cookie就可以直接登录?
答: 理论上是的, 只要用户知道你的加密方式, 写入个cookie理论是ok的, 但重要的地方建议登录再次验证, 当然只能说你点被...
问: 我复制某人的cookie岂不是就直接登录了?
答: 理论上还真是, 这可能就涉及到注入,攻击啥的了, 那如果这样的话, 要不是把浏览器相关信息+系统相关信息也加密到token里啊, 解密的时候再进行浏览器判断... 感觉好复杂啊...