「官網都用 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 這一層,等哪天被打穿才來換。
所以分層不是「我們沒有弱點」,而是:最核心、最多人資料的那一塊,不放在最常被打的那一層。
自己寫的核心系統,安全在哪裡?
簡單講四點:
- 攻擊面小:自己寫的系統只有我們需要的功能。WordPress 加十個外掛,就多了十個別人寫的程式在你的主機上跑,你用不到的功能,攻擊者一樣打得到
- 不在「掃全世界」的名單上:熱門外掛一出漏洞,攻擊者會寫程式掃遍全世界裝了這個外掛的網站。自己寫的系統只有我們一家在用,不會被這種大範圍掃描順手打到
- 依賴少、看得清楚:用了哪些套件、各是什麼版本,我們自己列得出來,有漏洞公告時對得上
- 自己掌握修補節奏:發現問題,自己改、自己測、自己上線,不用等外掛作者有空
這代表 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 這種滿分漏洞,語言本身不保證安全。
小公司一定要自己寫會員系統嗎?
不用。重點是把會員、訂單、付款資料和官網分開放;用有專人維護的電商或會員平台,也是一種分層。
參考來源
最後更新: