产品经理:前端实现网页防篡改,你会怎么做?

公众号:程序员白特,欢迎一起交流学习~

如果产品经理要求系统中某个页面的输入框做防止篡改处理,你会怎么做呢?

需求梳理

  • 首先,什么是防篡改?
    • 简单来说,就是用户输入input框值,我们传给后端的值就是用户输入的
  • 正常情况下用户输入input框值,就是我们传递给后端的值,但是部分浏览器插件或者恶意脚本会更改用户输入的值
    • 常见针对的是输入的钱包地址,我们需要防范被浏览器插件和恶意脚本更改
  • 因为实现的效果需要对已有的业务无任何侵入性,保证原有业务的正常运行
    • 这里的需求背景在nuxt2技术栈

最终效果

  • 业务方只需要加上这个指令就可以

实现思路

  • 我们如何保证对原有的代码没有侵入性,保证不影响原有的功能? 对此我们想到一个自定义指令,在指令里面操作。 但是一般指令都是直接写在组件里面的,并不是写在真实的 input 标签上,对此,我们要变更我们的指令,让其去找到真正的 input 标签。
// 通常情况下, 这是一个Input组件,我们需要给这个指令找到其真正的 input 标签
<Input v-xxx/>
  • 这里的代码实现的是如何找到真实的 input 标签。

  • 如何在指令里面发送请求给后端? 对此,我们在指令里面使用自定义事件,让真实的 input 标签绑定上自定义事件

  • 里面涉及2个知识点

    1. 如何给绑定过的 input标签解绑事件?
    2. 如何在指令里面调用请求的方法
  • 问题1答案,我们在指令的节点node, 在 vnode绑定上一个自定义函数,此自定义函数在解绑事件的时候在调用

  • 问题2答案,我们在vnode.context调用自定义方法tamperFn\(\); 这里的vnode.context 就是 this,相当于我们调用了 this.tamperFn\(\); 此处的this就是 Vue实例 (在下面的代码事例中有个属性 isTrusted 至关重要)

  • 至此,我们已经实现如何不侵入业务的情况下找到 input 标签 & 如何在 找到的 input 标签绑定事件并且发送请求出去 & 解绑事件 (有个核心问题,到目前为止没有看到如何区分提交的表单数据是用户写的还是被浏览器插件恶意改的,且继续往下看)
  • jsevent 有个属性 isTrusted

  • 首先要对所有的 input 标签使用Object.getOwnPropertyDescriptor 进行劫持,找到 input 标签的 set 属性,此时,当变更 input 的输入值我们都可以监控到变化,当有js变更input输入框的值都会触发 set 方法。

  • 上述的功能代码是一个完整的 config.js, 启动项目的时候直接在 nuxt.config.js 加载这个 config.js 即可,业务团队使用一个指令即可完成需求。

总结

我们来梳理下流程:

  1. 首先使用Object.getOwnPropertyDescriptor 进行劫持所有的 input 标签, 在里面会触发自定义事件dispatchTamper
  2. 自定义事件绑定在真实的 input 标签上,在浏览器执行js阶段完成了绑定事件。 通过 vnode.context 我们可以调用 Vue.prototype.tamperFn 方法。 在 tamperFn 里面拿到 isTrusted 来区分是不是被篡改的值。
  3. 我们在绑定 input 标签的事情同时,设置了 node.cusFn = cusFn, 用来解绑事件。
#前端##牛客在线求职答疑中心##牛客解忧铺##我的实习求职记录##2022届毕业生现状#
全部评论

相关推荐

一面直接挂了后来被PCG捞起来了,发个面经攒攒人品(敬请期待)3.19&nbsp;金融科技(一面挂)1.自我介绍2.这个工作室是一个部门嘛3.刚刚你说会就是给学弟学妹答疑,有针对他们的方案嘛4.你们工作室开发一个项目的整个流程,从需求到上线5.这些应用都是放在企业微信上面的嘛6.如果你分配的任务有人在截止时间之前没有搞完怎么办7.在这个开发过程中成员之间会出现什么问题嘛8.具体发生的问题的原因9.后续针对这类事件有采取什么措施嘛10.聊一聊开源项目遇到的困难之类的11.这个配置加组件是什么意思12.为什么要做这个防抖13.这个开源项目有被企业使用嘛14.设计模式15.在开发PC端和移动端需要额外注意的地方16.聊一聊proxy17.有学过vue2嘛,说一下vue2和vue3的区别18.webpack和vite区别19.有手写过插件嘛20.ts的泛型,你写过最难的一个类型21.windicss22.有用过windicss去封装一些组件吗23.pnpm和npm的区别(npm不是也有缓存吗,为什么说三十个依赖要下三十次)-&nbsp;应该是npm有缓存,只会下载一次,但是如果再出现的话就是会复制一份,而不是下载24.前端性能优化(遇到项目中感觉某个地方加载比较慢的情况吗,怎么解决)25.怎么学前端的26.重绘和重排,怎么避免重绘27.translate(0)加载到一个盒子上面会有什么不一样的地方-&nbsp;这个真不知道,查资料发现是有css3硬件加速,加载更快28.跨域问题29.讲一下你刚刚说的jsonp30.jsonp拿到数据之后呢,是一个什么东西-&nbsp;函数,一个get请求的回调函数,里面包含了数据31.浏览器可能遇到的攻击32.中间人攻击33.事件循环34.刚刚说的事件循环是在什么环境下的,node还是浏览器手写代码题1.每三位添加一个,2.力扣hot100&nbsp;栈的第一题35.写项目中让你印象最深的事情36.怎么调试的37.url输入后回车发生了什么事情反问环节
点赞 评论 收藏
转发
3 收藏 评论
分享
牛客网
牛客企业服务