1. 程式人生 > >一次 “靈異事件” 及由此引發的思考

一次 “靈異事件” 及由此引發的思考

上個週日,即 5 月 12 日,風和日麗,正和朋友在天河公園悠閒的散步。突然接到運營的電話,語氣匆匆的說道: “xxx, 不好啦,陰陽師官方論壇 好像被黑客攻擊了,全部頁面變成黑白了,看著挺嚇人的,你快回來修復一下”。一聽到這訊息,我肯定很震驚啊,做了幾年的 web 開發,總算被黑客盯上了,正如一句老話所言:出來混,遲早要還的。於是乎,我匆匆忙忙的和朋友道了別,小跑回公司,因為公司到天河公園就幾百米的路程嘛,所以大概 10 分鐘就到了,開啟電腦一看,嘖,還真是啊,頁面怎麼全部變成黑白了啊?

看上去,我的第一反應是有種淡淡的憂傷。之前也瞭解過,有些網站為了悼念某個人,可能會在那人的誕辰日把網站設定成黑白。但是,這種網站一般都是個人網站,他為了紀念過世的親友。可是,我們的陰陽師論壇不是個人網站,為了悼念誰呢?難道是悼念遊戲裡面的某個人物?

還有一個問題讓我困惑的是,運營說她上週五下班前看論壇還是正常的,就剛剛開啟才變成這樣的。我們週六日一般也沒有人回來加班的的,就算加班,也不可能隨意釋出程式碼到線上環境的。所以排除了週六日有人上傳了程式碼的可能。越想越覺得匪夷所思,難道真的是靈異事件?

既然,想不出來是什麼原因,那就老老實實的從程式碼中找原因啦,畢竟我們作為馬列主義的信仰者,才不相信什麼靈異事件呢!於是開啟 chrome dev tools ,通過稽核元素,選中 html 根元素,就看到設定瞭如下的樣式 :

filter: grayscale(100%);

咦,這不是濾鏡嘛!然後,把這程式碼刪除掉,頁面突然就變成了彩色了。所以找到頁面變成黑白的原因了,是因為添加了個濾鏡屬性。

可是,還有個問題是,這個濾鏡是誰加的?我在論壇專案的根目錄全域性搜尋 “filter” 關鍵字,卻什麼也沒有搜尋到。難道是我沒有更新程式碼,於是 git pull 一下,再搜尋,依舊沒有搜尋到任何東西。

然後,靜下心來想想,突然想到論壇是使用 discuz 來搭建的,除了原生代碼外,還可以在管理後臺的統計程式碼處新增 css 和 js 的,於是登入到後臺,果不其然,看到了一坨如下的程式碼:

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 週年。

事情的真相總算找到了,原來這是去年遺留的程式碼引起的。

這次 ”靈異事件“,引起了我對程式碼管理的一些思考:

  • 條件判斷要嚴格
  • 及時移除過期的程式碼
  • 讓使用者知情,或把選擇權交給使用者

第 1 點,條件判斷要嚴格:以這次事故為例,那段程式碼是去年新增的,本來是 希望僅在 2018-05-12 這天起作用的,可是,由於程式碼裡面只判斷了 月日,而沒有判斷年份,導致了在 2019-05-12、2020-05-12......每年的 5.12 都會起作用。所以,我們寫程式碼不應該偷懶,該嚴格的的地方還是得嚴格。

第 2 點,及時移除過期的程式碼:紀念汶川地震10週年,這屬於一次性活動,活動結束之後,這段程式碼就是多餘的、過期的了,所以應該要及時移除掉的。這種過期的程式碼,除了會其他後面接手的同學的理解之外,還可能會是一顆定時炸彈,你不知道它在什麼時候會爆炸。

第 3 點,讓使用者知情,或把選擇權交給使用者:並不是每個人都會 一下子想起來 5.12 是汶川地震,在他不知情的情況下開啟頁面,看到黑白,肯定會覺得莫名其妙的,甚至覺得網站是不是 有 bug 了。所以,可以開啟 頁面時,提示使用者: ”今天是汶川地震 xx 週年“。又或者,把是否要顯示成黑白的選擇權交給使用者,比如彈窗提示 “切換到黑白主題”,讓使用者 選擇 “是” 或 “不是”。

說到這裡,不知道大家還記不記得去年的 “antd 的聖誕彩蛋事件”,傳送門:如何看待 Ant Design 聖誕節彩蛋事件?。這種強行把自己的意願推加到使用者身上的做法,是不負責任的。想一下,比如你用 antd 做了個伊斯蘭國的政府網站 ,一開啟竟然全都是慶祝基督教聖誕節的彩蛋,這後果有多嚴重?所以,不要老是想著給使用者帶來什麼驚喜,因為每個使用者的性格或文化可能不一樣,你的精心準備,可能只會讓使用者有驚而無喜