kintone安全編碼指南

information

本頁面使用機器翻譯而成。
機器翻譯免責聲明 (External link)

目錄

概要

雖然使用API可以提高便利性,但也存在以下風險:

  • 存在安全問題。
  • cybozu.com服務無法正常工作。

本文將對使用kintone API的程式進行說明。

防止跨網站腳本和CSS注入

「跨站腳本」(XSS)是一種漏洞,攻擊者將惡意腳本代碼注入網站,導致訪問者的網路瀏覽器執行腳本。
與XSS一樣,CSS可以允許將惡意CSS代碼注入網頁中執行。
使這種攻擊成為可能的漏洞稱為「CSS注入」。

可能的威脅

使用XSS或CSS注入程式碼可能會導致:

  • kintone資料被盜。
  • 顯示假畫面。
  • 惡意Cookie儲存在您的網路瀏覽器中。

易受攻擊的程式碼示例

1
2
3
const text1 = document.getElementById('text1');
const div1 = document.getElementById('div1');
div1.innerHTML = '<input type="text" value="' + text1.value + '" />';

此代碼根據text1的值生成一個文字框。
如果在text1文字框中鍵入以下內容,則將執行開發者預測外的代碼。

1
"onclick="alert(1)

對策

對所有輸出元素執行逸出

在外部傳遞給程式的字串中,應逸出具有特殊含義(<``>``"例如)的字元。

正確逸出HTML元素需要大量知識。
盡可能避免使用document.writeinnerHTML動態生成HTML。
通過使用innerHTML而不是innerText,可以防止一般的XSS。

輸出URL應僅以「http://」或「https://」開頭

如果基於外部輸入(例如a標記的href屬性或img標記的src屬性)動態生成URL,javascript:系統可能會提示您輸入以開頭的字串並嵌入腳本。
為防止這種情況,請僅輸出以「http://」或「https://」開頭。

避免生成具有外部輸入值的元素

假設untrusted設定了外部輸入值。

1
2
3
4
5
6
7
const tag = document.createElement('script');

// 避免使用innerHTML實現
tag.innerHTML = untrusted;

// 使用innerText
tag.innerText = untrusted;
不要輕易載入放置在外部網站上的JavaScript和CSS

外部腳本可能會變更,並且有一天可能會突然啟動可竊取資料的程式。
即使是受信任的網站,供應鏈攻擊和篡改的風險也並非為零。
如果您想要擷取外部指令碼,請考慮下列措施:

  • 盡量減少使用外部腳本。
  • 凍結外部腳本版本以防止意外更新。
  • 利用子資源完整性(SRI)來偵測竄改。
使用外部程式庫時考慮風險

在kintone JavaScript開發中,透過套件管理器引入外部函式庫和依賴套件的機會很多。
然而,官方和廣泛使用的庫也存在以後可能包含惡意代碼或惡意軟件的風險。
因此,無論函式庫的可靠性如何,都要採取以下措施來確保依賴套件的安全性:

  • 選擇由受信任的開發人員管理的包。
  • 避免使用未維護或更新頻率極低的軟體包。
  • 定期npm audityarn audit以偵測已知漏洞。
  • 將依賴關係保持在最低限度,並儘可能刪除不必要的依賴關係。
  • 鎖定檔案以防止無意的版本升級。
  • 如果報告嚴重漏洞,請立即考慮更新或替代庫。

使用HTTPS進行通信

cybozu.com使用HTTPS來加密網路瀏覽器的通訊。
即使與外部系統連結,也要使用支援HTTPS的API。

適當地處理身份驗證和授權資訊

如果要與外部服務集成,則需要在某處存儲有關外部服務的身份驗證和授權的資訊。
考慮到這種資訊洩露的影響,請採取慎重考慮認證資訊的存儲位置和限制憑據洩露範圍等措施。
特別是,JavaScript自定義傾向於將身份驗證/授權資訊存儲在普通使用者可以查看的位置。

身份驗證/授權資訊範例

  • 密碼
  • API金鑰
  • OAuth用戶端金鑰和存取權杖

身份驗證/授權資訊的存儲位置

在這裡,我們將通過對它們進行如下分類來介紹它們。

  • 我們建議僅由管理員(具有特定許可權的人員)查看目標。
  • 不建議將其保存到一般使用者可以查看的位置。

這些僅供參考。
同樣,考慮到洩漏的後果,請仔細考慮將其存放在哪裡。

推薦存儲位置

*1 將kintone自訂換成外掛程式,並使用代理功能,可以將認證/授權資訊的披露範圍限製為具有應用管理員或更高許可權的使用者。
詳情請參閱以下頁面。
使用kintone外掛程式隱藏機密資訊的方法:介紹如何隱藏 (日語) ^

*2

通過使用Garoon代理API,可以將認證/授權資訊的披露範圍限制為具有管理員或更高許可權的使用者。
有關詳細內容,請參閱Garoon説明中的ProxyAPI設置。

^

*3 阻止透過JavaScript存取HttpOnly的Cookie。 ^

不推薦的存儲位置

Web儲存通常用於存儲資訊,可以從任何JavaScript訪問。
同樣,kintone外掛程式設置和非HttpOnly的Cookie也可以從JavaScript訪問。

因此,如果您訪問惡意網站,您的身份驗證/授權資訊可能會被濫用。

可供參考的文章

從外部安全地處理kintone資料

正確存儲獲取到的資料

從cybozu.com獲得的資料包含個人和機密資訊。
如果將此資訊存儲在外部應用程式中,請仔細設計和操作系統,以防止數據洩露或丟失。

使用使用者ID標識使用者

如果要唯一標識使用者,建議使用系統頒發的使用者ID。
登入名是可由cybozu.com共通管理員變更的項目。
如果稍後將使用者的登入名變更為其他用戶的登入名,則通過其登入名來標識這些使用者可能會指非預期使用者。

使用者ID可以透過以下API獲取:

使用JavaScript自訂時需要注意的其他要點

跨網域限制

由於跨網域限制,無法使用XHR(XMLHttpRequest)在cybozu.com和外部網站之間進行通信。無法授予「Access-Control-Allow-Origin」標頭。

由於cybozu.comCookie具有HttpOnly屬性,因此JavaScript無法獲取cybozu.comCookie。

重定向到外部網站

如果要根據外部輸入值動態生成要傳遞給物件的URL,如下所示,請實現它以確保生成預期的URL。

  • location.href
  • document.location
  • window.open

使用嚴格模式

您可以使用JavaScript的嚴格模式來防止編碼錯誤並使您的代碼更安全。
有關嚴格模式的詳細資訊,請參閱以下頁面。
MDN:嚴格模式 (External link)

嚴格模式的主要特點
  • 您只能將值分配給您聲明的變數。
  • 在eval函數中定義的變數範圍僅限於該函數。
  • 不支援arguments.callee。
1
2
'use strict';
mistypedVaraible = 17; // throws a ReferenceError