Vue前端浏览器链接/接口参数实现加密

news2025/1/10 21:33:12

场景

由于项目创建之前后端设计不合理,导致详情页链接参数id为顺序序数(例:1,2,3…等等),安全系数非常低(虽然我们前端做了菜单权限、按钮权限、Api权限等等),现在要前端解决下浏览器链接/接口参数实现加密🤬🤬

注:前端链接加密与接口参数加密(get请求)类似

思路过程

一、设计格式

项目正常链接为

contract/draft/contract-draft-detail?id=26197&type=news&key=1667198460529

我们最终需要base64加密成这种(如果不想base64加密也可换成其他加密方式 👇
如:RSA加密、AES加密、MD5加密、SHA256加密以及国密)

contract/draft/contract-draft-detail?__params=eyJpZCI6MjYxOTcsInR5cGUiOiJuZXciLCJrZXkiOjE2NjcxOTg0NjA1Mjl9

要想将参数加密,我这里设计的是,将所有参数以对象的形式进行加密,如图

正常参数格式: `id=26197&type=news&key=1667198460529`,
转化成对象:  {
	id: 26197,
	type: 'news',
	key: '1667198460529'
}

正常情况下,可直接 $route.query 获取参数对象,或 window.location.search 格式化获取,格式化函数见下方,

// URL参数转成对象
export function urlPasseObj(url = '', isUrl) {
  const result = url.split('?')[isUrl ? 1 : 0]
  if (!result) {
    return {}
  }
  const list = result.split('&')
  const obj = {}
  list.map(item => {
    if (item) {
      const arr = item.split('=')
      const value = arr[1]
      obj[arr[0]] = value === undefined ? '' : value
    }
  })
  return obj
}
  • 加密后都放到一个参数中,这里我命名为 __params

二、加/解密方法实现

这里要注意的是base64加密正常是字符串(String类型)进行加密,对对象(Object)进行加密,需要通过JSON.parse进行转义成String类型

代码如下

/**
 * base64(解密)
 * @param {String} str 跳转参数为base64字符串
 * @returns
 */
export const decryptBase64 = function(str) {
  // 添加decodeURIComponent解决其他特殊字符,如等号(=)会转成%3D,导致base64解密失败
  const decryptQuery = str ? JSON.parse(base64.decode(decodeURIComponent(str))) : {}
  return decryptQuery
}

/**
 * base64(加密)
 * @param {Object || String} param 跳转参数可以为对象或路径字符串
 * @returns
 */
export const encryptBase64 = function(param) {
  const encryptStr = base64.encode(JSON.stringify(param)) || ''
  return encryptStr
}

三、加密处理位置

  • $route.push跳转处

      通常咱们在Vue文件下通过 $router.push 进行路由跳转,跳转时需要对参数进行加密处理,这样跳转后的链接参数才会以加密的形式进行呈现。有些人可能觉得单独写一个方法进行路由跳转,不从 $router.push跳转了,但是我这个项目是中后期项目了,担心后面其他前端同事不熟悉项目,不知道加密这回事,所以我就在Router.prototype.push 直接进行修改了

代码如下:

// 在router/index.js中修改
const originalPush = Router.prototype.push
Router.prototype.push = function push(location, onResolve, onReject) {
  if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
  // 解决空对象中含有{__ob__: Observer},深拷贝
  let newLocation = deepCopy(location)
  if (newLocation?.query && Object.keys(newLocation.query).length !== 0) {
    newLocation = location.query?.__params ? location : {
      ...location,
      query: {
        __params: encryptBase64(newLocation.query)
      }
    }
  }
  return originalPush.call(this, newLocation).catch(err => err)
}
  • 路由拦截请求(处理get请求参数)
         在路由拦截器请求时,通常会处理一些逻辑。将token放入携带的请求头中等等,所以咱们要将get请求中参数在此处进行处理。get请求的参数会和浏览器链接一样,在url中,例:在这里插入图片描述
    所以我们处理方式与浏览器链接参数处理方式一样,具体实现方法如下,
request.interceptors.request.use(config => {
   if (config.method === 'get') {
    config.data = true
    // 判断是否有携带参数
    const isHash = config.url.includes('?')
    if (isHash) {
      // 将url上的参数调整到params中,然后调整清除url上的参数
      // urlPasseObj方法在上方
      const urlParam = urlPasseObj(config.url, true)
      config.params = config.params ? { ...config.params, ...urlParam } : urlParam
      config.url = config.url.split('?')[0]
    }
    if (config.params) {
      config.params = {
        __params: encryptBase64(config.params)
      }
    }
  }
  return config
}, errorHandler)

注:在无参数时,config中不存在params属性,所以要初始化一下

四、解密处理位置

  • 在App.vue中初始化一个变量来代替$router.query
watch: {
   '$route.query': {
     immediate: true,
     deep: true,
     handler(val) {
       if (val.__params) {
         const newQuery = decryptBase64(val?.__params)
         // 在vue原型上定义一个
         Vue.prototype.$route_query = newQuery
         return
       }
       Vue.prototype.$route_query = val || {}
     }
   }
 }

然后咱们只能将整个项目用到$route.query的地方,全局替换下了~~最后使用方式见下方
在这里插入图片描述

小结:

有可能会有人想问,为什么不把 $router.push也替换成全局,而只把 $route.query用一个变量替换?
        因为如果不将$route.query替换成另一个变量( $route_query ),没办法获取到解密的参数(除非一个文件一个文件看着改,而不可以全局替换改)。我当时尝试在路由守卫路由钩子函数里想要处理 $route.query中的参数,但是发现这个是一个只读的属性,不可以中途改变值。
        不把 $router.push也替换成全局,是为了方便后续其他同事在开发时,不需要注意加密参数了,push自动格式化参数成加密。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Linux运维总结:基于xtrabackup8工具全量物理备份Mysql8数据自动化工具(方案一)》

一、背景信息 说明:由于业务系统的特殊性,对数据的备份要求非常高,且数据量非常大,所以这里采用xtrabackup工具来对Mysql数据库进行全量物理备份。由于xtrabackup工具操作复杂,这里为了简便,基于xtrabackup…

张驰咨询:快速提高流程效率的5个关键精益生产工具

精益,又称“精益制造”或“精益生产”,注重通过消除浪费、消除缺陷,实现客户价值最大化。精益工具是关于理解过程,发现浪费,防止错误和记录你所做的事情。 让我们来看看流程改进中使用的五种精益工具,它们…

建立企业数据共享机制,打破数据壁垒

很多人可能也比较疑惑,为什么数据这么重要,能够有着数据治理、数据标准、数据管理以及我们接下来要讲的数据共享,各种针对数据的机制体系。一方面是因为数据在数字经济和数字化转型进程中发挥了巨大作用,甚至可以称得上是两者的核…

RCNN网络源码解读(Ⅰ) --- 获取数据并预处理数据

目录 1.RCNN是什么东西 2.处理数据集 2.1 code:下载VOC数据集(pascal_voc.py) 2.2 code: 数据集预处理(pascal_voc_car.py) 3.code区域候选建议(selectivesearch.py) 1.RCNN是什…

Web(十)JavaScript知识训练-JS函数

1、下列选项中,( B)可用于检查某个值是否为无穷大的数。 A、 isNaN() B、 isFinite() C、 parseInt() D、 parseFloat() 2、函数parseInt(15.36)…

燕东微在科创板上市:市值263亿元,北京电控、亦庄国投等为股东

12月16日,北京燕东微电子股份有限公司(下称“燕东微”,SH:688172)在上海证券交易所科创板上市。本次在上市,燕东微的发行价为21.98元/股,募资总额约为39.53亿元,募资净额约为37.57亿元&#xff…

【Java寒假打卡】Java基础-方法

【Java寒假打卡】Java基础-方法一、定义二、方法的定义和调用三、方法调用过程四、带参数的方法和调用五、debug查看方法参数传递六、带返回值的方法的调用七、方法重载八、方法传递数据九、返回一个数组的最大值和最小值一、定义 方法就是一段具有独立功能的代码块&#xff0…

Java中的Set系列集合

Set系列集合Set系列集合Set系列集合概述HashSet元素的底层原理:哈希表HashSet元素去重复的底层原理实现类:LinkedHashSet实现类:TreeSetCollection体系的特点、使用场景终结补充知识:可变参数集合工具类CollectionsCollection体系…

Unity PolyNav2D(2D寻路) 插件

下载地址 https://download.csdn.net/download/qq_27461747/87300286 组件 PolyNav2D 寻路地图,一般来说 有且只有一个, 寻路的主要接口就在这个组件里PolyNavObstacle 障碍物PolyNavAgent 导航代理, 带有移动功能。这个可有可无,可以自己…

重点| 系统集成项目管理工程师考前50个知识点(6)

本文章总结了系统集成项目管理工程师考试背记50个知识点!!! 帮助大家更好的复习,希望能对大家有所帮助 比较长,放了部分,需要可私信!! 40、冲突的下列特点: &#xff…

css知识复习点

四种css使用方式&#xff1a;内嵌式、外链式、行内式、导入式 复合选择器 后代选择器 选择器之间需要用空格隔开&#xff0c;后代不一定是儿子 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>复合…

渗透测试-crlf注入原理

目录 概念 HTTP报文结构与漏洞原理 漏洞检测 Bottle之CRLF漏洞 nginx配置错误之CRLF漏洞 漏洞危害 会话固定 修复建议 漏洞检测POC 概念 这个漏洞一般很少出现。 CRLF是CR和LF两个字符的拼接&#xff0c;它们分别代表”回车换行”&#xff08;\r\n&#xff09;。十六…

[附源码]Nodejs计算机毕业设计基于的学生事务管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

Java+mysql基于SSM的网上出差审批与费用报销系统 开题 毕业设计

本课题是一个基于SSM的管理系统,本网上出差审批与费用报销系统是在Windows7系统的环境下,利用Eclipse和Mysql工具开发的。在网上出差审批与费用报销系统中分为管理员和普通用户2个模块。其中网上出差审批与费用报销系统中的管理人员在登陆之后可以管理本系统内的部门信息管理,员…

性能测试场景:如何进行场景设计?

我们在前面屡次强调了场景的重要性,今天终于到了要把实际场景拿出来解析的时候了。 在本篇文章中,为了保证数据的连续性,我用之前的项目资料来作明确地说明。同时为了模糊关键业务信息,以及让场景的描述更通用性,我会把所有的业务名隐去。 根据之前我们所说的,基准性能…

【DevOps实战系列】第六章:详解Docker私服Nexus3篇

个人亲自录制全套DevOps系列实战教程 &#xff1a;手把手教你玩转DevOps全栈技术 概述/目标 私服我们很熟悉了&#xff0c;比如docker hub就是官方私服&#xff0c;而有些情况比如我们自建的镜像&#xff0c;不想往外传&#xff0c;就需要考虑内部搭建一个私有服务器来存放私有…

ELK 日志框架搭建 (springboot 接入 elk)

什么是ELK&#xff1f; ELK 是一个开源的实时日志分析平台&#xff0c;它主要由 Elasticsearch、Logstash 和 Kiabana 三部分组成。 Logstash Logstash 主要用于收集日志&#xff0c;它是一个开源数据收集引擎&#xff0c;具有实时管道功能。Logstash 可以动态地将来自不同数…

《大正野球娘》:棒球少女·棒球1号位

《大正野球娘。》是根据神乐坂淳的人气轻小说「大正棒球少女」及「大正棒球少女&#xff5e;沾满土与尘&#xff5e;」改编的电视动画。原作小说是神乐坂淳原作&#xff0c;小池定路插画的轻小说改德间书店出版&#xff0c;至2009年6月已发行三卷。此外&#xff0c;小说还被改编…

曙光超算平台如何使用以及常见问题

官方参考链接如下&#xff0c;有需要的自取&#xff1a; Notebook 计算服务 了解常用的E-shell命令 (1) squeue: 查看目前提交作业的信息 (2) salloc :抢占计算资源命令 salloc -p wzhdtest -N 1 -n 8 --gresdcu:1 &#xff08;部分地区有绑卡机制&#xff0c;比如乌镇&am…

PHP将PDF转图片-实战

Windows环境下 一、开启 Imagick 扩展 1、安装PHP扩展&#xff1a;Imagick&#xff0c;下载地址 https://pecl.php.net/package/imagick 注意和php版本保持一致&#xff1b; 2、将下载下来的文件解压&#xff0c;把php_imagick.dll复制到php/ext下&#xff0c;即php的扩展目…