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://」開頭的 URL。

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

假設 untrusted配置了外部輸入值。

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

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

// 使用 innerText
tag.innerText = untrusted;
不要從不受信任的外部網站載入 JavaScript 或 CSS

目標腳本可能會變更,並且有一天可能會突然啟動程式來竊取數據。
如果引入外部腳本,請確保該網站是可信的。

使用 HTTPS 進行通信

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

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

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

身份驗證/授權資訊範例

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

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

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

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

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

推薦目的地

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

*2

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

^

*3 阻止HttpOnly的Cookie 來自 JavaScript 的訪問。 ^

不推薦的目的地

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.com Cookie 具有 HttpOnly 屬性,因此 JavaScript 無法獲取 cybozu.com Cookie。

重定向到外部網站

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

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

使用嚴格模式

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

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