上个周日,即 5 月 12 日,风和日丽,正和朋友在天河公园清闲的散步。忽然接到运营的电话,语气匆匆的说道: “xxx, 很差啦,阴阳师官方论坛 好像被黑客攻击了,所有页面变成黑白了,你快回来修复一下”。一听到这消息,我确定很震惊啊,作了几年的 web 开发,总算被黑客盯上了,正如一句老话所言:出来混,早晚要还的。因而乎,我匆匆忙忙的和朋友道了别,小跑回公司,由于公司到天河公园就几百米的路程嘛,因此大概 10 分钟就到了,打开电脑一看,啧,还真是啊,页面怎么所有变成黑白了啊?css
看上去,个人第一反应是有种淡淡的忧伤。以前也了解过,有些网站为了悼念某我的,可能会在那人的诞辰日把网站设置成黑白。可是,这种网站通常都是我的网站,他为了记念过世的亲友。但是,咱们的阴阳师论坛不是我的网站,为了悼念谁呢?难道是悼念游戏里面的某我的物?html
还有一个问题让我困惑的是,运营说她上周五下班前看论坛仍是正常的,就刚刚打开才变成这样的。咱们周六日通常也没有人回来加班的的,就算加班,也不可能随意发布代码到线上环境的。因此排除了周六日有人上传了代码的可能。越想越以为匪夷所思,难道真的是灵异事件?git
既然,想不出来是什么缘由,那就老老实实的从代码中找缘由啦,毕竟咱们做为马列主义的信仰者,才不相信什么灵异事件呢!因而打开 chrome dev tools ,经过审核元素,选中 html 根元素,就看到设置了以下的样式 :web
filter: grayscale(100%);
复制代码
咦,这不是滤镜嘛!而后,把这代码删除掉,页面忽然就变成了彩色了。因此找到页面变成黑白的缘由了,是由于添加了个滤镜属性。chrome
但是,还有个问题是,这个滤镜是谁加的?我在论坛项目的根目录全局搜索 “filter” 关键字,却什么也没有搜索到。难道是我没有更新代码,因而 git pull 一下,再搜索,依旧没有搜索到任何东西。bash
而后,静下心来想一想,忽然想到论坛是使用 discuz 来搭建的,除了本地代码外,还能够在管理后台的统计代码处添加 css 和 js 的,因而登陆到后台,果不其然,看到了一坨以下的代码:antd
function bnw() {
var black = "filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); filter: grayscale(100%); -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); filter: url(data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\"><filter ….3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\"/></filter></svg>#grayscale); filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); filter: gray; -webkit-filter: grayscale(1);",
body_bg = "background:url(https://dhxy-f.netease.com/forum/201805/11/202133wufbodbhdzxqdeub.jpg) center top repeat-x!important";
var star_month = new Date().getMonth() + 1,
star_today = new Date().getDate(),
end_today = 13;
var _html = document.getElementsByTagName("html")[0],
_body = document.getElementsByTagName("body")[0];
if (star_month == 5 && end_today - star_today == 1) {
_html.style.cssText = black;
_body.style.cssText = body_bg;
}
}
bnw();
复制代码
这段代码虽然有点长,可是作的事情是:判断日期,若是是 5.12 日就添加滤镜效果,让页面变成黑白。 如今问题的根源已经找到了,原来是后台配置了一个定时炸弹。这不是什么灵异事件,更不是什么黑客攻击。 但是,这代码是谁加上去的?是何时添加上去?由于后台配置的代码没有 log, 我没法查看修改记录。另外, 5.12 是个什么特殊的日子呢?我只知道今天是母亲节。百思不得其姐的我,拿起电话打给 了老大,他一开始也很诧异,说最近没有接到过要在 5.12 把论坛设置成黑白的需求啊。而后,过了一会,他忽然大声的说:我想起来了,5.12 是汶川大地震记念日啊!这个需求是去年提的,当时为了 悼念 汶川地震 10 周年。svg
事情的真相总算找到了,原来这是去年遗留的代码引发的。网站
此次 ”灵异事件“,引发了我对代码管理的一些思考:url
第 1 点,条件判断要严格:以此次事故为例,那段代码是去年添加的,原本是 但愿仅在 2018-05-12 这天起做用的,但是,因为代码里面只判断了 月日,而没有判断年份,致使了在 2019-05-十二、2020-05-12......每一年的 5.12 都会起做用。因此,咱们写代码不该该偷懒,该严格的的地方仍是得严格。
第 2 点,及时移除过时的代码:记念汶川地震10周年,这属于一次性活动,活动结束以后,这段代码就是多余的、过时的了,因此应该要及时移除掉的。这种过时的代码,除了会影响后面接手同窗的理解以后,还可能会引发一些其余负面影响,就像此次的事件。
第 3 点,让用户知情,或把选择权交给用户:并非每一个人都会 一会儿想起来 5.12 是汶川地震,在他不知情的状况下打开页面,看到黑白,确定会以为莫名其妙的,甚至以为网站是否是 有 bug 了。因此,能够打开 页面时,提示用户: ”今天是汶川地震 xx 周年“。又或者,把是否要显示成黑白的选择权交给用户,好比弹窗提示 “切换到黑白主题”,让用户 选择 “是” 或 “不是”。
说到这里,不知道你们还记不记得去年的 “antd 的圣诞彩蛋事件”,传送门:如何看待 Ant Design 圣诞节彩蛋事件?。这种强行把本身的意愿推加到用户身上的作法,是不负责任的。想一下,好比你用 antd 作了个伊斯兰国的政府网站 ,一打开居然全都是庆祝基督教圣诞节的彩蛋,这后果有多严重?因此,不要总是想着给用户带来什么惊喜,由于每一个用户的性格或文化可能不同,你的精心准备,可能只会让用户有惊而无喜。