Index
概要
API の使用は、利便性を高める反面、次のリスクを伴います。
- セキュリティー上の問題が発生する
- cybozu.com のサービスが正常に動作しなくなる
このページでは、API を使用したプログラムを作成する上で注意すべき点を説明します。
クロスサイトスクリプティングを防ぐ
クロスサイトスクリプティングとは
クロスサイトスクリプティング( Cross-Site Scripting 以下 XSS)とは、Web サイト訪問者の入力をもとに画面を動的に生成して表示するプログラムが、閲覧者の Web ブラウザーに悪意あるコードを送信してしまう脆弱性のことです。
発生しうる脅威
XSS の脆弱性のあるプログラムを読み込むことで、次のようなことが起こり得ます。
- kintone のデータが盗み出される
- 偽の画面が表示される
- 悪意ある Cookie が Web ブラウザーに保存される
脆弱性のあるコードの例
var text1 = document.getElementById('text1'); var div1 = document.getElementById('div1'); div1.innerHTML = '<input type="text" value="' + text1.value + '" />';
このコードは、text1 の値からテキストボックスを生成します。text1 を次のような形式にすることで、コード実装者の意図しないコードが実行されます。
"onclick="alert(1)
対策
出力する全ての要素に対して、エスケープ処理を施す
外部からプログラムに渡される文字列から、特殊な意味を持つ文字(「<」「>」「”」など)をエスケープします。ただし、HTMLの要素を適切にエスケープするには、様々な知識を要します。できる限り、 document.write や innerHTML を使用したHTMLの動的な生成は避けることを推奨します。なお、innerHTML の代わりに innerText を使用することでも、一般的な XSS は防げます。
出力する URL は「http://」または 「https://」で始まる URL だけにする
外部からの入力をもとに a タグの href 属性や img タグの src 属性などのURLを動的に生成する場合は、「javascript:」などから始まる文字列を入力してスクリプトを埋め込まれる場合があります。これを防ぐには、「http://」と 「https://」で始まる URL のみを出力するようにします。
外部からの入力値を使用した要素の生成は避ける
以下のような実装をしてはいけません。
var tag = document.createElement(“script”); tag.innerText = untrusted;
外部からの入力値を使用したスタイルシートの生成は避ける
スタイルシートには、 expression() 等を利用してスクリプトを記述できます。
そのため、次のようなプログラムには脆弱性があります。
var tag = document.createElement(“div”); /* untrusted = "{ left:expression( alert('xss') )" などでXSSが発生 */ tag.style.cssText = untrusted;
信頼できない外部サイトに置かれた JavaScript や CSS を読み込まない
取り込み先のスクリプトが変わり、ある日突然、データを盗み出すためのプログラムが作動するかもしれません。外部のスクリプトなどを取り込む場合は、そのサイトを信頼できるかどうか、十分吟味してください。
クロスサイトリクエストフォージェリを防ぐ
クロスサイトリクエストフォージェリとは
クロスサイトリクエストフォージェリ( Cross-Site Request Forgeries 以下 CSRF )とは、Web サイトににスクリプトを組み込んで、閲覧者に意図せず別の Web サイトに対する何らかの操作を行わせる攻撃方法のことです。
cybozu.com に対してこの攻撃が行われた場合、cybozu.com にログインしたユーザー自身からリクエストが送られるため、そのリクエストが実行されてしまう場合があります。
発生しうる脅威
cybozu.com のユーザーが、自身が意図しない操作を行なってしまう。
CSRF を防ぐための制限
cybozu.com では、CSRF に対して次の対策が採られています。
- POST メソッドでのリクエストのみ受け付ける
- セッションごとに発行されるトークンが付いたリクエストのみ受け付ける
そのため、API を使用せずに cybozu.com に対してリクエストを送ることはできません。
JavaScript カスタマイズ利用時の注意点
CSRF 対策による上記の制限のため、kintone の JavaScript カスタマイズ機能で読み込むプログラムでは、イベントの取得やリクエストの送信には、本サイトで説明する JavaScript API を使用する必要があります。
kintone REST API 利用時の注意点
CSRF 対策による上記の制限のため、本サイトで説明する kintone REST API を使用しないリクエストは、外部から実行させることができません。
また、API によるリクエストには、認証情報を含める必要があります。リクエストに認証情報を含める方法は、本サイトの説明や kintone SDK やサンプルを参考にしてください。
通信に HTTPS を使用する
通信方法の制限
cybozu.com のサービスでは、HTTPS によりお客様の Web ブラウザーとの通信を暗号化しています。
API を使用するための通信にも、HTTPS を使用する必要があります。
JavaScript カスタマイズ利用時の注意点
kintone の JavaScript カスタマイズ機能で読み込むプログラムで、外部のサイトに置かれたコンテンツ( JavaScript、CSS など)をインポートする場合、通信には HTTPS を使用する必要があります。
kintone REST API 利用時の注意点
kintone REST API を使用するための通信には、HTTPS を使用する必要があります。 cybozu.com で発行される Cookie には、Secure 属性がついているため、HTTPS での通信が必要です。また、通信に「セキュアアクセス」サービスを使用する場合には、クライアント証明書を使用した認証が必要です。クライアント証明書による認証の実装については、kintone SDK をご利用になるか、サンプルプログラムを参考にしてください。
認証情報を適切に取り扱う
外部サービスと連携する場合は、外部サービスの認証情報をどこかに保存する必要があります。
認証情報の保存場所は、認証情報が漏洩した場合の影響を考慮して、慎重に検討してください(認証情報の公開範囲を限定してください)。
特に JavaScript カスタマイズを利用する場合は、一般利用者が閲覧できる場所に保存されやすい傾向があります。
認証情報の一例
- パスワード
- API キー
- OAuth クライアントシークレット・アクセストークン
認証情報の保存先
ここでは、「管理者(特定の権限を保持する人)しか閲覧できない保存先を推奨する」、「一般ユーザーでも閲覧できる保存先を推奨しない」に分類して紹介します。
こちらはあくまで参考情報です。繰り返しになりますが、漏洩した場合の影響を考慮して適切な保存先を慎重に検討してください。
推奨する保存先
- バックエンド(サーバー内のデータベースやサーバレスプラットフォームなど)
- kintone プラグインのプロキシ ※1
kintone.plugin.app.setProxyConfig() 、kintone.plugin.app.getProxyConfig() - Garoon プロキシ API ※2
- HttpOnly の Cookie ※3
※1: kintone カスタマイズをプラグイン化し、プロキシ機能を利用することで、認証情報の公開範囲をアプリ管理者以上の権限に限定できます。
詳細は 「kintoneプラグイン開発入門 【Part2: 情報の隠匿方法編】」 を参照してください。
※2: Garoon プロキシ API を利用することで、認証情報の公開範囲を管理者以上の権限に限定できます。
詳細は「プロキシ API の設定(クラウド版・オンプレ版)」を参照してください。
※3: HttpOnly の Cookie は、JavaScript からのアクセスを防ぎます。
推奨しない保存先
- フロントエンドのプログラム(例:kintone JavaScript カスタマイズ、Garoon JavaScript カスタマイズ)
- Web Storage( localStorage 、sessionStorage)
- kintone プラグインの設定
kintone.plugin.app.setConfig() 、kintone.plugin.app.getConfig() - HttpOnly ではない Cookie
情報の保存先として利用されることが多い Web Storage は、任意の JavaScript からアクセスできます。
同様に kintone プラグインの設定や HttpOnly ではない Cookie も、JavaScript からアクセスできます。
そのため、悪意のあるサイトにアクセスしてしまった場合などに、認証情報が悪用される可能性があります。
取得したデータを適切に保管する
cybozu.com から取得したデータには、個人情報や機密情報が含まれます。
これらの情報を外部アプリケーションで保存する場合は、データの流出や損失が発生しないよう、慎重にシステムの設計と運用を行うようにしてください。
JavaScript カスタマイズ利用時のその他の注意点
クロスドメイン制約
クロスドメイン制約のため、XHR( XMLHttpRequest )を使用した cybozu.comと 外部サイトとの通信はできません。Access-Control-Allow-Origin ヘッダーは付与できません。
JavaScript での Cookieの 取得
cybozu.com の Cookie には HttpOnly 属性が付いているため、JavaScript で cybozu.com の Cookie を取得することはできません。
外部サイトへのリダイレクト
次のようなオブジェクトに渡すURLを、外部からの入力値をもとに動的に生成する場合は、想定したURLが生成されていることを確認するように実装してください。
- location.href
- document.location
- window.open
strict モードの使用
JavaScript の strict モードを使うと、コーディングのミスを防ぎ、コードをよりセキュアなものにすることができます。strict モードの詳細は MDN のドキュメント を参照してください。
strict モードの主な特徴
- 宣言した変数だけに値を代入できる
- eval 関数内で定義された変数のスコープが、その関数の中だけに限定される
- arguments.callee がサポートされない
"use strict"; mistypedVaraible = 17; // throws a ReferenceError
サービスへの影響を考慮する
問題のあるプログラムによって、サービス低下や利用不能な状況が発生することがあります。
短時間で大量のリクエスト送信を避ける
自動的に大量のリクエストを送信するようなプログラムや、並列で多数のリクエストを同時実行するプログラムは、レスポンス悪化などのサービス低下を招く原因になります。サーバーの高負荷や大量リソース消費を生じさせるリクエストについては、アクセス制限を実施させていただく場合がありますのでご注意ください。
複数の Web ブラウザーで動作を確認する
読み込む JavaScript プログラムの問題によって、kintone の機能が正常に動作しなくなる場合があります。カスタマイズした kintone の機能が意図通りに動作していることを十分確認してください。
Web ブラウザーの種類やバージョンの違いによって問題が発生する場合があります。動作確認の際には、複数の Web ブラウザーを使用することを推奨します。
適切なユーザーエージェントを設定する
どのようなサービスやツールからリクエストを送信しているか判別可能にするために、適切なユーザーエージェント( User-Agent ヘッダー)を設定してください。
ユーザーエージェントのガイドラインについては、以下の RFC 7231 の「User-Agent」の項をご参照ください。
- RFC 7231 5.5.3. User-Agent http://www.ietf.org/rfc/rfc7231.txt
arguments.caleeではなくarguments.callee ではないでしょうか?
ご連絡が遅くなりまして大変申し訳ありません。
arguments.callee に修正しました。