都是會員系統,為什麼 PHP 出事,西布倫會員系統不在範圍?官網用 WordPress、核心自己寫的理由

這週 PHP 出了 php2shell,我們跑 PHP 的七台主機當晚全部修補,但西布倫的會員系統完全不在範圍,因為它不是 PHP 寫的。這不是巧合:我們的做法是官網用 WordPress,圖它方便、外掛多、全世界都能用;會員、運單、付款這種核心系統自己寫,後端用 Java 系或 TypeScript。這篇講為什麼這樣分、自己寫的系統安全在哪裡,也講它的極限。

「官網都用 WordPress 了,會員系統為什麼不也用 WordPress 外掛做一做就好?」

這個問題我被問過很多次。WordPress 有現成的會員外掛、購物車外掛、論壇外掛,裝起來一個下午就能上線,自己寫一套會員系統,要花好幾個月。

這週 PHP 出了 php2shell,剛好可以回答這個問題。這是 PHP 引擎本身的漏洞,官方說可以讓沒登入的人遠端執行程式碼。我們跑 PHP 的七台主機,當晚全部升級修補;西布倫的會員帳號、運單與付款資料,則完全不在這次的範圍,因為那套系統不是 PHP 寫的。

我們的系統怎麼分?

我們維運的系統,大致分成兩層:

  • 對外的官網:用 WordPress,也就是 PHP。放的是公開的文章、服務說明、詢價表單
  • 核心系統:會員帳號、運單、付款、入庫這些,自己寫。後端用 Java 系或 TypeScript,前端有的用 Vue,有的由後端直接產生畫面

官網為什麼用 WordPress?因為它的優點是真的:外掛多、佈景主題多、全世界的主機都能跑、找得到人維護,行銷的人自己就能改文章。官網要的是「快、好改、好被搜尋到」,WordPress 很擅長。

但我一直對 PHP 的安全性有保留。不是 PHP 不能寫出安全的程式,而是它太方便了:方便到很多人裝了一堆外掛、很少更新,方便到攻擊者只要找到一個熱門外掛的漏洞,就能掃全世界。所以我的原則是:方便的東西放在外面,重要的東西放在裡面。

這次 PHP 出事,打得到哪一層?

php2shell 打得到的,是跑 PHP 的那一層。以西布倫來說:

  • 官網:WordPress,是 PHP,在這次範圍裡,當晚升級完成。官網不放會員帳號、運單或付款資料,就算出事,也碰不到會員資料庫
  • 會員系統:會員帳號、收件地址、運單與付款資料都在這裡。後端是 Java 系,整台沒有 PHP,不在這次範圍

要說清楚的是,我們不是完全沒有 PHP 系統存客人的資料。我們的客服信件系統是 PHP,存的是客人與客服的往來信件;另外有一套舊版的網購系統也是 PHP,有會員與訂單資料。這兩套這次都在七台裡,當晚一起升級。

那套網購系統,我們正在用 Vue 和 TypeScript 重寫。原因很直接:有會員、有訂單的系統,我不想讓它一直留在 PHP 這一層,等哪天被打穿才來換。

所以分層不是「我們沒有弱點」,而是:最核心、最多人資料的那一塊,不放在最常被打的那一層。

自己寫的核心系統,安全在哪裡?

簡單講四點:

  1. 攻擊面小:自己寫的系統只有我們需要的功能。WordPress 加十個外掛,就多了十個別人寫的程式在你的主機上跑,你用不到的功能,攻擊者一樣打得到
  2. 不在「掃全世界」的名單上:熱門外掛一出漏洞,攻擊者會寫程式掃遍全世界裝了這個外掛的網站。自己寫的系統只有我們一家在用,不會被這種大範圍掃描順手打到
  3. 依賴少、看得清楚:用了哪些套件、各是什麼版本,我們自己列得出來,有漏洞公告時對得上
  4. 自己掌握修補節奏:發現問題,自己改、自己測、自己上線,不用等外掛作者有空

這代表 Java 就不會有漏洞嗎?

不是。自己寫的程式一樣會有 bug,Java 的世界也出過大漏洞:2021 年的 Log4Shell(CVE-2021-44228),是 Java 很常用的記錄功能套件 Log4j 的漏洞,CVSS 評到 10.0 滿分,影響範圍比這次更廣。

差別不在語言。自己寫的系統一樣要更新、一樣要測、一樣要有人顧,只是出問題時,你知道去哪裡找、找到了能自己改。分層也只是讓「最壞的情況」變得比較小,不是讓壞事不會發生。

小公司要學這個做法嗎?

不一定要自己寫系統。重點是分層,不是寫程式:

  • 官網和會員資料分開放:官網用 WordPress 沒問題,但會員、訂單、付款資料最好不要跟官網放在同一台主機、同一個資料庫
  • 官網只放公開的東西:官網被打,損失的是公開文章;會員資料被打,損失的是客人的信任
  • 核心系統可以用成熟的服務:不想自己寫,就用有專人維護安全的電商或會員平台,一樣是把核心放到另一層

如果想看看自己的網站現在是怎麼分層的,可以跟我們聯絡。

常見問題

php2shell 會影響用 WordPress 做的會員系統嗎?

會。php2shell 是 PHP 本身的漏洞,WordPress 跑在 PHP 上,用 WordPress 外掛做的會員系統一樣在範圍內,要升級主機上的 PHP。

西布倫的會員資料這次有受影響嗎?

會員帳號、運單與付款資料所在的會員系統,後端是 Java 系,整台沒有 PHP,不在這次漏洞範圍。西布倫的 WordPress 官網是 PHP,當晚已升級,官網不放會員資料。

你們有 PHP 系統存客人資料嗎?

有。客服信件系統存客人與客服的往來信件,舊版網購系統有會員與訂單資料,兩套都是 PHP,這次都在當晚升級的七台裡。網購系統正在用 Vue 和 TypeScript 重寫,就是為了把有會員資料的系統移出 PHP 這一層。

自己寫的系統就比較安全嗎?

不一定。自己寫的好處是攻擊面小、不會被大範圍掃描外掛漏洞順手打到、自己能決定什麼時候修;壞處是要有人持續維護。Java 也出過 Log4Shell 這種滿分漏洞,語言本身不保證安全。

小公司一定要自己寫會員系統嗎?

不用。重點是把會員、訂單、付款資料和官網分開放;用有專人維護的電商或會員平台,也是一種分層。

參考來源

最後更新: