你有用过 JavaScript 中的函数劫持么?
source link: https://www.fly63.com/article/detial/11521
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
扫一扫分享
什么是函数劫持
最近业务上看到一段逻辑,找了好久,没发现它是怎么被触发的,后来发现其实使用了函数劫持,大致如下:
// 原始函数
var saveLog = function (log) {
console.log(`我保存了日志:${log}`);
}
// 1-保存原有函数
var originSaveLog = saveLog;
// 2-改写原有函数
saveLog = function () {
const args = Array.prototype.slice.call(arguments);
// 3-在改写后的函数中执行原有函数的逻辑
originSaveLog.apply(null, args);
console.log('我要劫持你这个函数,用来做自己的事情');
}
saveLog('test Save Log');
大致实现的逻辑就是在每次调用保存日志的同时执行自己的逻辑,比如格式化、通知等。
函数劫持,在一个函数运行之前就把它劫持下来,添加我们想要的功能。当这个函数实际运行的时候,它已经不是原本的函数了,而是被我们添加上去的功能。这也是我们常见的钩子函数的原理之一。
如上面的示例,一般函数劫持会分成三步 :
- 使用新的变量保存被劫持函数
- 新函数中改写被劫持函数
- 新函数中调用原有的函数(保存在变量中的函数)
为什么可以这么做?
一开始,我看上面这段代码还有疑惑,当重新给 saveLog 赋值的时候,不会改变 originSaveLog 的引用指向么?事实上是不会的,只会将 saveLog 指向另外一个引用地址。
可以看下面的例子就很容易理解了:
let a = {};
let b = a;
a.name = 'Gopal';
// ture {name: 'Gopal'} {name: 'Gopal'}
console.log(b === a, a, b);
基础:两个对象指向同一个地址的时候,修改某个对象的属性,另外一个对象也会随之变化
let a = {};
let b = a;
a = {name: 'Gopal'};
// false {name: 'Gopal'} {}
console.log(b === a, a, b);
基础:将新的对象赋值给对象变量的时候,该对象变量就指向了新对象的引用地址,跟旧引用切断关联
增强你的函数功能
如上面的第一个例子,在原有的函数之上,实现特定的逻辑。
追踪 XSS 攻击
一般 XSS 攻击会先利用 alert() 等方法输出信息进行测试,这个时候,我们可以对原先的 alert() 进行劫持,向其输入追踪信息的代码,最后才把原函数执行。
如下所示:
function report(caller) {
var img=new Image();
img.src=`http://www.site.com/getReport.php?caller=${encodeURIComponent(caller)}`;
}
var _alert = window.alert;
window.alert = function (s) {
// 拿到攻击者相关信息,并上报
report(alert.caller)
_alert(s)
}
alert('test');
劫持 ajax 请求,实现 mock 功能
mock.js 中,就是通过对原生的 XMLHttpRequest(或 ActiveXObject)进行劫持,判断有没有找到匹配的数据模板,如果找到,则拦截 XHR 请求逻辑,执行自身规则对应的逻辑。如果未找到匹配的数据模板,则采用原生 XHR 发送请求。详细代码看这里。
JavaScript 中的函数劫持是一个增强原有函数的技巧,一般我们用来对原有的 JavaScript 全局方法做一些能力的增强。
来源: 前端杂货铺
Recommend
-
72
DNS - @mengdisheng - 因为个人博客用了腾讯云 cdn https,里面好像能直接开 http2.0 所以有这个疑问。
-
85
-
70
在恐怖分子劫持人质的危急时刻,一名法国警察,拿自己的命交换出了人质…
-
75
问与答 - @zzl - 用 TIM 聊天,同事给我发了一个 chrome 插件链接,在我的 TIM 里面显示的竟然是某区块链币的地址,同一条消息显示的还不一样,我的电脑怎么了,除了腾讯还有其他人在监控我的 TIM 啊。
-
49
-
19
写于 2016.09.21 说到劫持,第一反应可能是什么不好的东西。函数劫持并不邪恶,关键是看使用的人。虽然这个概念在前端领域使用较少,但是在安全领域、自定义业务等场景下还是有一定的使用价值的。所以,这一篇文章将会和大家一起去了解一下JS中的函数劫持是什么,
-
27
2020年01月06日 阅读 17490 你可能从未使用过的11+个JavaScript特性
-
12
作为前端,一直以来都知道HTTP劫持与XSS跨站脚本(Cross-site scripting)、CSRF跨站请求伪造(Cross-site request forgery)。但是一直都没有深入研究过,前些日子同事的分享会偶然提及,我也对这一块很感兴趣,便深入...
-
12
高效的5个pandas函数,你都用过吗?朱卫军公号:python大数据分析之前为大家介绍过10...
-
1
盘点那些年CPU中的神U,你有用过吗?|处理器|英特尔|主板|amd|cpu|ghz_网易订阅 #头条创作挑战赛#CPU的种类、数量之多不可量化,但总有...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK