セキュアコーディング ガイドライン

フォローする

Index

概要

APIの使用は、利便性を高める反面、次のリスクを伴います。

  • セキュリティー上の問題が発生する
  • cybozuのサービスが正常に動作しなくなる

このページでは、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に対してこの攻撃が行われた場合、cybozuにログインしたユーザー自身からリクエストが送られるため、そのリクエストが実行されてしまう場合があります。

発生しうる脅威

cybozuのユーザーが、自身が意図しない操作を行なってしまう。

CSRFを防ぐための制限

cybozuでは、CSRFに対して次の対策が採られています。

  • POSTメソッドでのリクエストのみ受け付ける
  • セッションごとに発行されるトークンが付いたリクエストのみ受け付ける

そのため、APIを使用せずにcybozuに対してリクエストを送ることはできません。

JavaScript カスタマイズ利用時の注意点

CSRF対策による上記の制限のため、kintoneのJavaScriptカスタマイズ機能で読み込むプログラムでは、イベントの取得やリクエストの送信には、本サイトで説明する JavaScript API を使用する必要があります。

kintone REST API 利用時の注意点

CSRF対策による上記の制限のため、本サイトで説明するkintone REST API を使用しないリクエストは、外部から実行させることができません。
また、APIによるリクエストには、認証情報を含める必要があります。リクエストに認証情報を含める方法は、本サイトの説明やkintone SDK やサンプルを参考にしてください。

通信にHTTPSを使用する

通信方法の制限

cybozuのサービスでは、HTTPS によりお客様の Web ブラウザとの通信を暗号化しています。APIを使用するための通信にも、HTTPSを使用する必要があります。

JavaScript カスタマイズ利用時の注意点

kintoneのJavaScriptカスタマイズ機能で読み込むプログラムで、外部のサイトに置かれたコンテンツ(JavaScript、CSSなど)をインポートする場合、通信にはHTTPSを使用する必要があります。

kintone REST API 利用時の注意点

kintone REST API を使用するための通信には、HTTPSを使用する必要があります。 cybozuで発行されるCookieには、secure属性がついているため、HTTPSでの通信が必要です。また、通信に「セキュアアクセス」サービスを使用する場合には、クライアント証明書を使用した認証が必要です。クライアント証明書による認証の実装については、kintone SDK をご利用になるか、サンプルプログラムを参考にしてください。

 

取得したデータは適切に保管する

cybozuから取得したデータには、個人情報や機密情報が含まれます。これらの情報を外部アプリケーションで保存する場合は、データの流出や損失が発生しないよう、慎重にシステムの設計と運用を行うようにしてください。
特に、パスワードなどの重要な情報をプログラムにハードコーディングするような実装は避けてください。

JavaScript カスタマイズ利用時のその他の注意点

クロスドメイン制約

クロスドメイン制約のため、XHR(XMLHttpReuest) を使用したcybozuと外部サイトとの通信はできません。Access-Control-Allow-Origin ヘッダーは付与できません。

JavaScriptでのCookieの取得

cybozuのCookieには httponly属性が付いているため、JavaScriptでcybozuのCookie を取得することはできません。

外部サイトへのリダイレクト

次のようなオブジェクトに渡すURLを、外部からの入力値をもとに動的に生成する場合は、想定したURLが生成されていることを確認するように実装してください。

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

strict モードの使用

JavaScript の strict モードを使うと、コーディングのミスを防ぎ、コードをよりセキュアなものにすることができます。strict モードの詳細は MDNのドキュメント を参照してください。

strict モードの主な特徴

  • 宣言した変数だけに値を代入できる
  • eval関数内で定義された変数のスコープが、その関数の中だけに限定される
  • arguments.calee がサポートされない
"use strict";
mistypedVaraible = 17; // throws a ReferenceError

サービスへの影響を考慮する

問題のあるプログラムによって、サービス低下や利用不能な状況が発生することがあります。

短時間で大量のリクエスト送信を避ける

自動的に大量のリクエストを送信するようなプログラムや、並列で多数のリクエストを同時実行するプログラムは、レスポンス悪化などのサービス低下を招く原因になります。サーバーの高負荷や大量リソース消費を生じさせるリクエストについては、アクセス制限を実施させていただく場合がありますのでご注意ください。

複数のWebブラウザーで動作を確認する

読み込むJavaScriptプログラムの問題によって、kintoneの機能が正常に動作しなくなる場合があります。カスタマイズしたkintoneの機能が意図通りに動作していることを十分確認してください。
Webブラウザーの種類やバージョンの違いによって問題が発生する場合があります。動作確認の際には、複数のWebブラウザーを使用することを推奨します。

適切なユーザーエージェントを設定する

どのようなサービスやツールからリクエストを送信しているか判別可能にするために、適切なユーザーエージェント(User-Agent ヘッダー)を設定してください。

ユーザーエージェントのガイドラインについては、以下のRFC 7231の"User-Agent"の項をご参照ください。

 

記事に関するフィードバック

直接的に記事と関連がないご質問はcybozu developer コミュニティをご活用ください。

Avatar
Ryo ONODERA

arguments.caleeではなくarguments.callee ではないでしょうか?

ログインしてコメントを残してください。
Powered by Zendesk