過去曾介紹過一系列利用「Google Apps Script 操作試算表資料庫」的文章,如果這樣的簡單資料庫只是私用,自然不必考慮安全性。然而如果資料公開的話,防駭反而是第一要務,比學習任何 Google Apps Script(簡稱 GAS) 程式技術都更重要。 本站的「會員系統」正是使用 Google 試算表做為資料庫,當初並沒有太擔心被駭,原因有二: <script> 內容,儲存到後端資料庫,當前端讀取時便會執行指令碼。 破解方法:很簡單,前、後端都對 < > 這些字元進行處理,指令碼就不能執行了。 2. Reflected XSS反射型 XSS,攻擊方式為將 script 藏在網址,傳遞到後端資料庫儲存。 破解方法同上,後端對單、雙引號及特殊字元進行處理即可。 3. DOM Based XSS此攻擊方式為前端,在輸入欄位填入一些 HTML 碼,例如在 <img> 網址藏惡意 script 連結就能執行。 破解方法同上,前端對特殊字元進行處理即可。 4. SQL Injection SQL 注入是很常見的攻擊方式,不過 Google 試算表後端用 GAS 執行,並不會用到 SQL 語法,所以不需擔心。 但還是需要特別瞭解這種攻擊方式,因為 SQL 攻擊是鑽 SQL 語法的漏洞,那麼 GAS 使用 Javascript,那我們就需要小心有沒有 JS injection 的手法。 5. DOS DOS 是很常見的後端攻擊方式,利用短時間大量的請求轟炸伺服器。但前面提過了,Google 伺服器自然知道如何應對,所以我們不必擔心。 < 經 HTML Entity 編碼後成為 < ,前端將此字串存入後端資料庫後,將來讀取並顯示在網頁上時,依然會顯示 < 符號,如此就可避免被偷塞 HTML 碼且執行。 這麼做的好處是,無論使用者是有意或無心輸入了某些特殊符號,前端都能正常顯示這些特殊符號,且不執行 HTML 碼。
- 如果真能駭入後端試算表伺服器,那 Google 會比我更擔心,這可是世界級的駭客實力
- 這個會員系統主要功用為,讓會員有權限看到我寫的一些工具程式碼,就算被破解導致內容被看到,我也沒什麼實質上的損失,本站的程式碼本來就是個人筆記用途
一、injection 注入攻擊
以 Google 試算表做為資料庫的情況,高端駭客手法就交給 Google 伺服器應對,我們要自行負責不被程式碼注入攻擊,無論是前端網頁或是後端 GAS。 這篇「身為 Web 工程師,你一定要知道的幾個 Web 資訊安全議題」,介紹了幾個常見的網頁攻擊手法,請參照該篇的範例,以下說明跟本文相關的部分: 1. Stored XSS XSS 是 Cross-site scripting(跨站指令碼攻擊) 的縮寫。 Stored XSS 是儲存型 XSS,利用網頁上的輸入欄位,輸入二、防止 injection 攻擊
1. 哪些特些字元需要預防從前面的常見攻擊手法來看,針對 Google 試算表資料庫而言,一般 JS 前後端要防止程式碼注入攻擊,只要針對以下這 4 個特殊符號進行處理,駭客就沒搞頭了:" ' < >
2. 其他特殊字元這篇「SQL Injection 的多種攻擊方式與防護討論」滿不錯的,提供了許多特殊字元建議站長針對資料庫安全逐一測試,不過這畢竟是 SQL 的環境。 至於 JS 環境,我想若是有某些程式碼使用了 eval(),那麼被偷偷塞入函數時是有可能被執行的,所以檢測過上面這篇提出的特殊字元,我建議也對以下這些符號進行處理,多做總比少做好: = () {} ? + |
3. HTML Entity 編碼這篇「HTML Entity 簡介」說明了對特殊字元進行 HTML Entity 編碼後,可在網頁上正常顯示符號。 舉例來說,左箭頭符號 三、範例程式碼
瞭解本文所有概念後,對於 Google 試算表資料庫防止 code injection,我們需要做的就是將前端使用者輸入的字串內容,以及後端接收的所有字串內容,針對某些特殊字元進行編碼,轉成 HTML Entity。 這個討論串「Encode HTML entities in JavaScript」提供了 JS 範例,以下為我整理過的程式碼:var reg = /["'<>=(){}?+|]/g, // 所有要轉換的特殊字元 inputStr = "這裡是使用者輸入的字串'<script>(function(){alert(\"你被駭了\")})()<\/script>", // 原始字串 newStr = htmlEntity(inputStr); // 轉譯字串 alert(newStr); // 彈跳視窗可看到轉譯字串 document.write(newStr); // 在網頁上呈現的轉譯字串 function htmlEntity(str) { return str.replace(reg, function(i) { return "&#" + i.charCodeAt(0) + ";"; }); }
轉譯後的字元可以安心存入後端資料庫,不會有任何危險。而前端顯示的轉譯字串,又能跟當初輸入時一模一樣,使用者不會察覺任何異狀。 更多 Google Apps Script 相關技巧: