Vue进阶(贰零捌)浏览器地址栏URL防篡改攻略

文章目录

    • 一、前言
    • 二、动态路由
    • 三、Params 参数
    • 四、在 URL 中使用加密参数
    • 五、参数转码
    • 六、拓展阅读

一、前言

在应用 vue.js 开发前端项目时,浏览器中url 地址栏参数的处理是一个很基础但却很重要的问题。在很多情况下,我们需要从 url 中获取参数,比如从上一个页面跳转到当前页面,需要将一些信息传递给这个页面,这时候就需要将这些信息以参数的形式传递给 url。但是,有时候这些参数又需要被隐藏起来,毕竟 url 中敏感信息不应该被轻易泄露,因此本文将介绍如何在 vue.js 中隐藏地址栏参数。

二、动态路由

首先,我们可以通过 Vue.js 的动态路由来隐藏地址栏中的参数。动态路由是一种将 URL 中的参数与实际展示的组件进行映射的技术。举个例子,我们假设有一个文章列表页,每篇文章都有一个唯一的 ID 用于标识这篇文章,我们可以将这个 ID 作为路由的一个参数,然后在组件中读取这个 ID 并使用它来获取对应的文章信息。

具体来说,我们可以首先在路由配置中定义一条动态路由,将路由的路径中的某一段(比如文章 ID)设置为动态参数:

const router = new VueRouter({
  routes: [
    {
      path: '/article/:id',
      name: 'Article',
      component: Article
    }
  ]
})

在这个例子中,:id 就是一个动态参数,表示文章的 ID。在对应的组件中,我们可以通过 $route.params.id 来获取这个参数的值:

export default {
  mounted () {
    console.log(this.$route.params.id)
  }
}

这样,在用户访问这个路由时,即可在组件中获取到参数的值,而 URL 中并不会显示这个参数。

三、Params 参数

除了使用动态路由,我们还可以通过 Params 参数来隐藏地址栏中的参数。

举个例子,我们假设有一个搜索页,需要在搜索时将用户输入的关键词传递给服务器来获取匹配的结果,可以将输入的关键词作为 Params 参数,然后在路由组件中获取和解析这个参数:

const router = new VueRouter({
  routes: [
    {
      path: '/search',
      name: 'Search',
      component: Search
    }
  ]
})

// 当用户在输入框中输入搜索关键词时
this.$router.push({
  name: 'Search',
  params: { keyword: '关键词' }
})

export default {
  mounted () {
    console.log(this.$route.params.keyword)
  }
}

在这个例子中,params 选项表示传递的参数。然后在组件中可以通过 $route.params.keyword 来获取这个参数的值。这样在 URL 中就看不到实际传递的参数了。

四、在 URL 中使用加密参数

除了以上两种方法,我们还可以在 URL 中使用加密参数来隐藏地址栏参数。具体来说,我们可以将参数进行加密后再传递给 URL,这样在 URL 中即使被他人截获,也无法轻易解析出实际的参数值。

加密的方式有很多种,可以使用对称加密(如 DESAES)或非对称加密(如 RSA)等算法来进行加密。在这里不做过多介绍。

在 Vue.js 中使用加密参数时,可以将加密后的参数写入 CookieLocalStorage 等本地存储器中,然后让后续的页面读取这个数据并进行解密。这样可以保证加密的参数只在本地存储器中显示,而不会暴露给 URL。唯一需要注意的是加密后的参数长度应该要比明文参数的长度要小,不然会导致 Cookie 等存储器过大。

以上就是在 Vue.js 中隐藏地址栏参数的三种方法。无论哪种方法,我们都需要确保在保证安全性的前提下,尽可能的隐藏 URL 中的参数值。诚然,这并不是一件简单的事情,但在实际开发中,对于一些敏感数据而言,这个问题却是非常重要的。

五、参数转码

应用Base64实现将URL参数转码并作为参数追加至url中,若同一用户拷贝该url至新视图并试图修改url参数,则无法继续访问页面,或者不同用户拷贝该url不做任何url修改在新视图中也无法正常访问,因为url中涉及用户身份标识。

import Base64 from 'base-64'

Vue.prototype.$setCCMSAuthCode = function (obj) {
  let copyQuery = JSON.parse(JSON.stringify((obj.query)))
  copyQuery.usrUid = store.getters.usrUid
  return Base64.encode(encodeURIComponent(JSON.stringify(copyQuery)))
}

Vue.prototype.$router_push = function (obj) {
  if (obj.query && JSON.stringify(obj.query) !== '{}') {
    let copyQuery = JSON.parse(JSON.stringify((obj.query)))
    copyQuery.usrUid = store.getters.usrUid
    obj.query.AuthCode = Base64.encode(encodeURIComponent(JSON.stringify(copyQuery)))
    this.$router.push({
      path: obj.path,
      query: obj.query
    })
  } else {
    this.$router.push({
      path: obj.path
    })
  }
}

// 白名单的路径
// const whiteList = ['/login']// 不重定向白名单
let islogin = false
router.beforeEach((to, from, next) => {
  NProgress.start()
  if (islogin) {
    islogin = false
    next()
    NProgress.done() // 在hash模式下 改变手动改变hash 重定向回来 不会触发afterEach 暂时hack方案 ps:history模式下无问题,可删除该行!
    return
  }
// 未登录
  if (!store.getters.usrUid) {
    store.dispatch('GetInfo').then(res => {
      if (res.code === 99) {
        islogin = true
        if (process.env.NODE_ENV === 'development') {
          next('/login')
        } else {
          window.location.href = window.logOutUrl
        }
        return
      }
      const role = res.usrUid
      store.dispatch('SetRole', role)
      router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
      next(to.fullPath) // hack方法 确保addRoutes已完成
    })
  } else {
    // 方案一
    if (to.fullPath !== '/login' && JSON.stringify(to.query) !== '{}') {
      if (to.fullPath.indexOf('AuthCode') < 0) {
        let copyQuery = JSON.parse(JSON.stringify((to.query)))
        copyQuery.usrUid = store.getters.usrUid
        let obj = {AuthCode: Base64.encode(encodeURIComponent(JSON.stringify(copyQuery)))}
        let query = Object.assign({}, to.query, obj)
        console.log(query, 'query')
        router.push({path: to.path, query: query})
        return
      } else {
        let copyQuery = JSON.parse(JSON.stringify((to.query)))
        copyQuery.usrUid = store.getters.usrUid
        delete copyQuery.AuthCode
        if (decodeURIComponent(Base64.decode(to.query.CCMS_AuthCode)) !== JSON.stringify(copyQuery)) {
          next('/404')
        }
      }
    }
    // 方案二
    // if (to.fullPath !== '/login' && JSON.stringify(to.query) !== '{}') {
    //   let copyQuery = JSON.parse(JSON.stringify((to.query)))
    //   copyQuery.usrUid = store.getters.usrUid
    //   delete copyQuery.AuthCode
    //   if (!to.query.AuthCode || decodeURIComponent(Base64.decode(to.query.AuthCode)) !== JSON.stringify(copyQuery)) {
    //     next('/404')
    //   }
    // }
    if (to.path === '/login') {
      next()
    } else {
      next()
      NProgress.done() // 在hash模式下 改变手动改变hash 重定向回来 不会触发afterEach 暂时hack方案 ps:history模式下无问题,可删除该行!
    }
  }
})
router.afterEach((to) => {

  NProgress.done()
  // 跳转回页面顶部
  window.scrollTo(0, 0)
})

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,
  i18n,
  components: {App},
  template: '<App/>'
})

六、拓展阅读

  • 《Vue进阶(幺叁捌):vue 路由传参的几种基本方式》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/601800.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Express初体验

介绍 Express是一个基于Node.js平台的极简、灵活的Web应用开发框架&#xff0c;官方地址&#xff1a;https://www.expressjs.com.cn/&#xff0c;简单来说&#xff0c;Express是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发Web应用&#xff08;HTTP…

提升Go语言数学运算能力:math包使用指南

提升Go语言数学运算能力&#xff1a;math包使用指南 介绍数学函数的使用基本数学运算幂和根的计算三角函数对数计算 特殊数学常数和函数数学常数超越数学函数错误处理和精度问题 高级应用实例统计数据的标准偏差计算利用三角函数解决实际问题 性能优化技巧避免不必要的函数调用…

机器学习——4.案例: 简单线性回归求解

案例目的 寻找一个良好的函数表达式,该函数表达式能够很好的描述上面数据点的分布&#xff0c;即对上面数据点进行拟合。 求解逻辑步骤 使用Sklearn生成数据集定义线性模型定义损失函数定义优化器定义模型训练方法&#xff08;正向传播、计算损失、反向传播、梯度清空&#…

计算机系列之数据结构

19、数据结构&#xff08;重点、考点&#xff09; 1、线性结构 线性结构&#xff1a;每个元素最多只有一个出度和一个入读&#xff0c;表现为一条线状。线性表按存储方式分为顺序表和链表。 1、顺序存储和链式存储 存储结构&#xff1a; 顺序存储&#xff1a;用一组地址连续…

【功耗仪使用】

一&#xff0c;功耗仪使用 1.1&#xff0c;功耗仪外观及与手机&#xff0c;电脑连接方式 power monitor设备图 同时power monitor设备的后端有一个方形插孔通过数据线与电脑主机USB接口相连接&#xff0c;圆形插孔为电源插孔&#xff0c;用来给power monitor设备通电 pow…

图算法必备指南:《图算法:行业应用与实践》全面解读,解锁主流图算法奥秘!

《图算法&#xff1a;行业应用与实践》于近日正式与读者见面了&#xff01; 该书详解6大类20余种经典的图算法的原理、复杂度、参数及应用&#xff0c;旨在帮助读者在分析和处理各种复杂的数据关系时能更好地得其法、善其事、尽其能。 全书共分为10章&#xff1a; 第1~3章主要…

FFmpeg 音视频处理工具三剑客(ffmpeg、ffprobe、ffplay)

【导读】FFmpeg 是一个完整的跨平台音视频解决方案&#xff0c;它可以用于音频和视频的转码、转封装、转推流、录制、流化处理等应用场景。FFmpeg 在音视频领域享有盛誉&#xff0c;号称音视频界的瑞士军刀。同时&#xff0c;FFmpeg 有三大利器是我们应该清楚的&#xff0c;它们…

idea Maven 插件 项目多环境打包配置

背景 不同环境的配置文件不一样&#xff0c;打包方式也有差异 1. 准备配置文件 这里 local 为本地开发环境 可改为 dev 名称自定义 test 为测试环境 prod 为生产环境 根据项目业务自行定义 application.yml 配置&#xff1a; spring:profiles:#对应pom中的配置active: spring.…

二分图(染色法与匈牙利算法)

二分图当且仅当一个图中不含奇数环 1.染色法 简单来说&#xff0c;将顶点分成两类&#xff0c;边只存在于不同类顶点之间&#xff0c;同类顶点之间没有边。 e.g. 如果判断一个图是不是二分图&#xff1f; 开始对任意一未染色的顶点染色。 判断其相邻的顶点中&#xff0c;若未…

打造文旅客运标杆!吐鲁番国宾旅汽携苏州金龙升级国宾级出行体验

新疆&#xff0c;这片神秘的大地&#xff0c;从无垠沙漠到高耸天山&#xff0c;从古老丝路到繁华都市&#xff0c;处处都散发着独特的魅力&#xff0c;吸引着四面八方的游客。据新疆维吾尔自治区文化和旅游厅数据显示&#xff0c;刚刚过去的“五一”小长假&#xff0c;新疆全区…

5月白银现货最新行情走势

美联储5月的议息会议举行在即&#xff0c;但从联邦公开市场委员会&#xff08;FOMC&#xff09;近期透露的信息来看&#xff0c;降息似乎并没有迫切性。——美联储理事鲍曼认为通胀存在"上行风险"&#xff0c;明尼阿波利斯联邦储备银行行长卡什卡利提出了今年不降息的…

算法学习:数组 vs 链表

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f3af; 引言&#x1f6e0;️ 内存基础什么是内存❓内存的工作原理 &#x1f3af; &#x1f4e6; 数组&#xff08;Array&#xff09;&#x1f4d6; 什么是数组&#x1f300; 数组的存储&#x1f4dd; 示例代码&#…

【Spark】 Spark核心概念、名词解释(五)

Spark核心概念 名词解释 1)ClusterManager&#xff1a;在Standalone(上述安装的模式&#xff0c;也就是依托于spark集群本身)模式中即为Master&#xff08;主节点&#xff09;&#xff0c;控制整个集群&#xff0c;监控Worker。在YARN模式中为资源管理器ResourceManager(国内s…

编程入门(六)【Linux系统基础操作三】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;LInux的进程管理和磁盘管理top命令显示查看进…

SpringBoot整合Redis(文末送书)

文章目录 Redis介绍使用IDEA构建项目&#xff0c;同时引入对应依赖配置Redis添加Redis序列化方法心跳检测连接情况存取K-V字符串数据&#xff08;ValueOperations&#xff09;存取K-V对象数据&#xff08;ValueOperations&#xff09;存取hash数据&#xff08;HashOperations&a…

2024年武汉市工业投资和技术改造及工业智能化改造专项资金申报补贴标准、条件程序和时间

一、申报政策类别 (一)投资和技改补贴。对符合申报条件的工业投资和技术改造项目,依据专项审计报告明确的项目建设有效期(最长不超过两年)内实际完成的生产性设备购置与改造投资的8%,给予最高不超过800万元专项资金支持。 (二)智能化改造补贴。对符合申报条件的智能化改造项目…

互联网产品为什么要搭建会员体系?

李诞曾经说过一句话&#xff1a;每个人都可以讲5分钟脱口秀。这句话换到会员体系里面同样适用&#xff0c;每个人都能聊点会员体系相关的东西。 比如会员体系属于用户运营的范畴&#xff0c;比如怎样用户分层&#xff0c;比如用户标签及CDP、会员积分、会员等级、会员权益和付…

鸿蒙通用组件弹窗简介

鸿蒙通用组件弹窗简介 弹窗----Toast引入ohos.promptAction模块通过点击按钮&#xff0c;模拟弹窗 警告对话框----AlertDialog列表弹窗----ActionSheet选择器弹窗自定义弹窗使用CustomDialog声明一个自定义弹窗在需要使用的地方声明自定义弹窗&#xff0c;完整代码 弹窗----Toa…

Seata之TCC 模式的使用

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能…

【python数据分析基础】—pandas透视表和交叉表

目录 前言一、pivot_table 透视表二、crosstab 交叉表三、实际应用 前言 透视表是excel和其他数据分析软件中一种常见的数据汇总工具。它是根据一个或多个键对数据进行聚合&#xff0c;并根据行和列上的分组键将数据分配到各个矩形区域中。 一、pivot_table 透视表 pivot_tabl…
最新文章