localstorage无法真正防篡改,核心是让篡改后立即失效:采用结构化存储(含version、expiresat、routes、hash),路由守卫三重校验(时效性、完整性、路径匹配),多标签页监听storage事件主动响应,控制台仅作轻量提示。

localStorage 本身无法真正防止用户篡改——它是完全开放给 JavaScript 访问的,控制台里一行 localStorage.setItem('xxx', 'xxx') 就能改掉。所谓“防篡改”,本质不是锁住它,而是让篡改后立刻失效、无法继续使用。
结构化存储 + 版本与签名校验
别直接存裸数据(比如一个数组或布尔值),而是封装成带元信息的对象:
- 包含 version(如
"20260721.1"),用于识别配置版本 - 包含 expiresAt(毫秒时间戳),设定有效期,过期即弃用
- 包含 routes 或其他核心变量的实际值
- 包含 hash(比如对
routes + version做一次 MD5 取前8位),用于验证内容完整性
示例:{"version":"20260721.1","expiresAt":1753113600000,"routes":["/admin","/log"],"hash":"f8a2e1c9"}
路由守卫中实时三重拦截
每次跳转前,在 router.beforeEach 里检查三项,任一失败就清缓存、跳 403、强制刷新:
- 当前时间是否超过
expiresAt—— 防长期篡改后持续生效 - 重新计算
hash是否匹配存储值 —— 防手动增删路径 -
to.path是否严格落在routes数组里 —— 非模糊匹配,不支持通配符
失败时执行:localStorage.removeItem('auth:route-config'); router.push('/403'); location.reload();
多标签页监听与主动失效
用户可能在另一个 tab 改了 localStorage,当前页必须感知并响应:
- 监听
window.addEventListener('storage', handler),只关注auth:route-config键变更 - 监听到变更后,不信任新值,立即触发本地校验逻辑;校验失败则同上清空+跳转+刷新
- 登录成功或权限更新后,先
removeItem再写入新值,避免旧缓存残留
控制台层面轻量防护(仅提示,非依赖)
不能阻止修改,但可快速暴露异常:
- 入口处监听
storage事件,检测到auth:route-config被改,自动用原始合法值覆盖,并console.warn('权限配置异常,已恢复') - 开发环境可临时禁用写入:
Object.defineProperty(window.localStorage, 'setItem', { value: () => {} }),仅调试用 - 生产环境不靠这个防御,它只是辅助提醒,核心防线仍在前面三重校验
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











