2021年5月1日

Google Apps Script 操作試算表資料庫防駭技巧﹍防止程式碼注入攻擊

Google Apps Script 操作試算表資料庫防駭技巧﹍防止程式碼注入攻擊

Wayne Fu 0 A+
過去曾介紹過一系列利用「Google Apps Script 操作試算表資料庫」的文章,如果這樣的簡單資料庫只是私用,自然不必考慮安全性。然而如果資料公開的話,防駭反而是第一要務,比學習任何 Google Apps Script(簡稱 GAS) 程式技術都更重要。 本站的「會員系統」正是使用 Google 試算表做為資料庫,當初並沒有太擔心被駭,原因有二:
  • 如果真能駭入後端試算表伺服器,那 Google 會比我更擔心,這可是世界級的駭客實力
  • 這個會員系統主要功用為,讓會員有權限看到我寫的一些工具程式碼,就算被破解導致內容被看到,我也沒什麼實質上的損失,本站的程式碼本來就是個人筆記用途
所以最早並沒有太在意資料庫的防護問題,一方面真正付費儲值點數的會員沒那麼多,所以沒有花時間研究可能被入侵的手法,一方面覺得等有人動歪腦筋時再來解決就好,知名度不夠的話宵小還看不上眼。 結果幾年前還真的遇到 script kid(腳本小子)竄改了後台資料,但我後台都有留 log 記錄,聯絡上他後表示只是好玩,小朋友也不會真的對他怎麼樣。無論如何這麼做只能動到他自己帳號的部分,不影響其他會員的資料。這種程度的破壞談不上被駭,只是被輕微的 code injection(程式碼注入攻擊),以下就來看如何做到。 (圖片出處: pexels.com)

一、injection 注入攻擊

以 Google 試算表做為資料庫的情況,高端駭客手法就交給 Google 伺服器應對,我們要自行負責不被程式碼注入攻擊,無論是前端網頁或是後端 GAS。 這篇「身為 Web 工程師,你一定要知道的幾個 Web 資訊安全議題」,介紹了幾個常見的網頁攻擊手法,請參照該篇的範例,以下說明跟本文相關的部分: 1. Stored XSS XSS 是 Cross-site scripting(跨站指令碼攻擊) 的縮寫。 Stored XSS 是儲存型 XSS,利用網頁上的輸入欄位,輸入 <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 伺服器自然知道如何應對,所以我們不必擔心。

二、防止 injection 攻擊

1. 哪些特些字元需要預防 從前面的常見攻擊手法來看,針對 Google 試算表資料庫而言,一般 JS 前後端要防止程式碼注入攻擊,只要針對以下這 4 個特殊符號進行處理,駭客就沒搞頭了: " ' < > 2. 其他特殊字元 這篇「SQL Injection 的多種攻擊方式與防護討論」滿不錯的,提供了許多特殊字元建議站長針對資料庫安全逐一測試,不過這畢竟是 SQL 的環境。 至於 JS 環境,我想若是有某些程式碼使用了 eval(),那麼被偷偷塞入函數時是有可能被執行的,所以檢測過上面這篇提出的特殊字元,我建議也對以下這些符號進行處理,多做總比少做好: = () {} ? + | 3. HTML Entity 編碼 這篇「HTML Entity 簡介」說明了對特殊字元進行 HTML Entity 編碼後,可在網頁上正常顯示符號。 舉例來說,左箭頭符號 < 經 HTML Entity 編碼後成為 &#60;,前端將此字串存入後端資料庫後,將來讀取並顯示在網頁上時,依然會顯示 < 符號,如此就可避免被偷塞 HTML 碼且執行。 這麼做的好處是,無論使用者是有意或無心輸入了某些特殊符號,前端都能正常顯示這些特殊符號,且不執行 HTML 碼。

三、範例程式碼

瞭解本文所有概念後,對於 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 相關技巧:
0 0
如這篇文章對你有幫助,歡迎「分享」到 FB、「追蹤」粉絲團、「訂閱」最新文章

沒有留言:

張貼留言注意事項:

◎ 勾選「通知我」可收到後續回覆的mail!
◎ 請在相關文章留言,與文章無關的主題可至「Blogger 社團」提問。
◎ 請避免使用 Safari 瀏覽器,否則無法登入 Google 帳號留言(只能匿名留言)!
◎ 提問若無法提供足夠的資訊供判斷,可能會被無視。建議先參考這篇「Blogger 提問技巧及注意事項」。
◎ CSS 相關問題非免費諮詢,建議使用「Chrome 開發人員工具」尋找答案。
◎ 手機版相關問題請參考「Blogger 行動版範本的特質」→「三、行動版範本不一定能執行網頁版工具」;或參考「Blogger 行動版範本修改技巧 」,或本站 Blogger 行動版標籤相關文章。
◎ 非官方範本問題、或貴站為商業網站,請參考「Blogger 免費諮詢 + 付費諮詢
◎ 若是使用官方 RWD 範本,請參考「Blogger 推出全新自適應 RWD 官方範本及佈景主題」→ 不建議對範本進行修改!
◎ 若留言要輸入語法,"<"、">"這兩個符號請用其他符號代替,否則語法會消失!
◎ 為了過濾垃圾留言,所有留言不會即時發佈,請稍待片刻。
◎ 本站「已關閉自刪留言功能」。

TOP