谈谈JS中的函数劫持
说到劫持,第一反应可能是什么不好的东西。函数劫持并不邪恶,关键是看使用的人。虽然这个概念在前端领域使用较少,但是在安全领域、自定义业务等场景下还是有一定的使用价值的。所以,这一篇文章将会和大家一起去了解一下JS中的函数劫持是什么,有什么用。
基本概念
函数劫持,顾名思义,即在一个函数运行之前把它劫持下来,添加我们想要的功能。当这个函数实际运行的时候,它已经不是原本的函数了,而是带上了被我们添加上去的功能。这也是我们常见的钩子函数的原理之一。
乍一看上去,这很像是函数的改写。函数的改写也可以理解为是函数劫持的一种,但是这种方式太恶心了。作为一个劫持者,在绑票获得好处以后也应该遵守职业道德,把人原封不动地还回去,所以我们得在合适的地方把函数原本的功能给重新调用回来。
推而广之,其实“劫持”这一概念我们经常会遇到,比方说某网站被运营商劫持了,在浏览该网站的时候会弹出运营商的广告。
举例分析
现在我们来举个简单的例子,劫持一下alert()函数,为它增添一点小小的功能:
let warn = alert window.alert = (t) = { if (confirm(How are you?)) warn(t) alert(Help me...!!!)
可以打开开发者工具尝试一下这个例子,你会发现只有你在confirm里面点击了OK,才会弹出Help me...!!!。
接下来我们把这部分的内容封装一下,成为一个通用的函数:
const hijack = (obj, method, fun) = { let orig = obj[method] obj[method] = fun(orig)
首先我们定义了一个hijack函数,它会先把原函数给保存下来,然后执行自定义函数,而原函数将会在自定义函数内部进行调用。
然后我们来劫持confirm()函数:
hijack(window, confirm, (orig) = { return (text) = { alert(HELP ME PLZ!!!) if (orig.call(this, text)) { alert(YOU SEEMS FINE AND I AM LEAVING, GOOD BYE!) } else { alert(HOLD ON! I AM COMING!!) }
这段函数的功能很简单就不详细说明了,直接调用confirm()你就知道了。
反劫持
新建一个页面,打开你的开发者工具控制台,输入alert,你会看到这样的输出:
function alert() { [native code] }
然后使用本文开头的那段代码,把alert()劫持一下,再重新在控制台输入alert,你会看到这样的输出:
通过上述的例子可以知道,要看一个函数是否被劫持了,只需要直接把它打印出来即可。针对系统原生的函数,[native code]即代表它是纯净无污染的。
函数劫持的作用
除了为函数增加功能以外,还能够利用函数劫持去追踪恶意用户的信息。一般的XSS攻击会先利用alert()等能够输出信息的方法进行测试,这时候我们可以先对原生alert()进行劫持,向其输入追踪信息的代码,最后才把原函数释放出去。当恶意用户在测试alert()的时候就会立即被我们追踪,而他本人却无从察觉。
后记
关于JS的函数劫持,也不是什么新鲜的东西,只是在最近的工作中遇到了这个知识点感觉比较陌生,所以花了一些时间进行了研究,并把结果记录下来。如果发现有什么错漏的地方欢迎指正!
感谢你的阅读,欢迎关注我的专栏,我将不定期分享自己的学习体验,开发心得,搬运墙外的干货。下次见啦!
作者:jrainlau
来源:51CTO
JavaScript 中的生成器函数 调用一个生成器函数并不会马上执行它里面的语句,而是返回一个这个生成器的 迭代器对象。在生成器函数内部可以通过yield关键字来中断代码的执行,迭代器每次执行都会执行到下一次 yield 或者 return。
相关文章
- [Node.Js] Session 保存用户信息
- js中(function(){…})()立即执行函数写法理解
- Prototype js library
- 【面试】吃透了这些Redis知识点,面试官一定觉得你很NB(干货 | 建议珍藏) c#自定义Attribute获取接口实现 纯JS ajax 聊聊DataTable下载 二进制数据的序列化反序列化和Json的序列化反序列化的重要区别
- 微信小程序:【JS】中的函数合集!更新中...
- js数组
- js函数只执行一次,函数重写,变量控制与闭包三种做法
- js不是从上到下执行的吗?
- js函数的调用问题
- Js sort()核心用法,有了它,你无需再为数组排序而发愁
- 【手撕代码系列】JS手写实现防抖函数
- JS迭代器函数大全
- 浅谈JS函数防抖及应用场景
- JS高阶---变量与函数提升
- JS弹出子窗口
- 《Node.js区块链开发》——导读
- HTML、JS、字符串的简单加密与解密
- JS初识高阶函数和函数柯里化
- mongo批量删除js示例
- js方法队列的一次实践
- [js高手之路] es6系列教程 - 箭头函数详解
- js一些编写的函数
- cocos2dx-js学习笔记(一)环境搭建
- JS 函数相关的声明调用
- JS学习第6天——PC端网页特效(元素偏移量offset、元素可视区client、元素滚动scroll、动画函数封装、节流阀、网页轮播图案例、mouseenter与mouseover区别)
- 封装异步API-js先执行完一个函数后再执行下面的逻辑或者方法