Webアプリケーションには, 正しく実装しなければ個人情報の流出などの重大な事件を起こすリスクがある. サービスの開発者は, 注意深くWebアプリケーションを実装しなければならない.
サービスの開発者は, 情報処理推進機構:情報セキュリティ:脆弱性対策:安全なウェブサイトの作り方 に準拠してサービスを実装しなければならない.
ただし, 以下で補足する事項や他の標準によって規定されている事項は除く.
以下では, 安全なウェブサイトの作り方 に対する補足を記述する.
サービスの開発者は, 言語やフレームワークで用意されているセッション機構が安全であるか確認しなければならない.
セッションIDに十分なエントロピーが含まれているか
セッション情報が格納されるのはどこか. 格納先でどのようなリスクがあるか.
セッション情報がDBに格納されるのであれば, 個人情報などを格納するのを避けなければならない.
格納先のリスクによってはログアウト時にセッション情報を消去するようにする必要がある.
* セッション情報の消去は保険的な対策として, 常に行なってもよい.
サービスの開発者は, 個人情報を閲覧/編集する画面などにsecure属性のないセッションIDだけでアクセスできないように実装しなければならない.
可能であれば セッションクッキーに対して httponly 属性を付与する.
サービスの開発者は, クロスサイト・スクリプティング防止のために以下を行なわなければならない.
TODO: JavaScriptの手順に分離
サービスの開発者は, 「3) <script>..</script> 要素の内容を動的に生成しないように」しなければならない. script要素の内部で動的な情報を取り扱いたい場合には, 画面に表れないHTMLの要素を利用する.
- 標準的には, input要素(type=”hidden”)のvalue属性値に動的な情報を定義して(HTMLエスケープは行なうこと)スクリプトからDOM経由で参照する.
- JavaScript の Unicode エスケープシーケンスに変換する - Sarabande.jp のようなエスケープ方式を利用して, 動的な文字列をエスケープして JavaScript の文字列リテラルに埋め込む方法を利用してもよい.
ただし, フレームワークなどで用意されている方法があればそれを利用してもよい. フレームワークが提供する方式は適当かどうかとフレームワークが利用する秘密情報に十分なエントロピーが含まれているか確認すること.
CSRF トークンの送信された値と期待値との比較には, 応答時間によりトークンの値を推測されるのを防ぐため実行時間が文字列長にのみ依存する方式を利用したほうがよい.
(ECナビ固有の情報のため削除)
サービスは, 利用者の退会が可能でなければならない. サービスの開発者は, 退会機能を用意する必要がある. 退会機能を用意することが難しい場合には, メールなどによるお問合せでの退会を受けつける必要がある.
サービスは, 運用上退会後も一定期間情報の保持が必要な場合を除き利用者の退会直後に機密情報を削除しなければならない. 退会後に一定期間の情報の保持が必要な場合は, 期間終了後に機密情報を削除しなければならない.
機密情報の削除については, 情報の暗号化の標準 の 機密情報の削除/廃棄 も参照すること
サービスは, メールに利用者の個人情報(住所, 電話番号など)を記述してはならない. ただし, BtoBサービスなどで利用者の個人情報が公開情報であることが期待される場合は除く.
サービスは, 利用者に定期的に送られるメールについて具体的な内容とおおまかな送信日時をサイトに明示したほうがよい.
機密情報を扱うサービスは, ログイン履歴を記録し利用者に対し閲覧可能にすることを推奨する. ログイン履歴が閲覧可能なことで, 侵入の抑止力となったり事故の早期発見につながるといった効果が期待できる. 少なくとも, ログイン日時とログイン時のIPアドレスを記録すること. 他に UserAgent などの情報を記録してもよい.
ログインだけなく, 重要な操作についての履歴を残し利用者に対し閲覧可能にしてもよい.
機密情報を扱うサービスは, 2要素認証の利用を可能にすることを推奨する.
TODO: 文章が適当
サービスの開発者は, HTTPS で保護されたページでは画像・CSS・JavaScriptなどもhttpではなく https でアクセスするようにしなければならない. ただし, そのページがhttp/https どちらでもアクセスできかつ何ら機密情報などを含まないものであれば, http でのアクセスを許してもよい.
httpのページにhttpsのページをframeやiframeで出力してはならない.
HTTPレスポンスヘッダで
を出力すると, Internet Explorer 8以降でコンテンツの内容からファイルタイプを決定しないように強制できる. すべての動的コンテンツのレスポンスヘッダで出力することを推奨する.
すべてのページで X-Frame-Options を適当に設定することを推奨する. 今後も含めフレームなどでの埋め込みを許さないのであれば DENY を 同じオリジンからの埋め込みを許すのであれば SAMEORIGIN を設定する.
ただし, ブログパーツなど他のサイトに埋め込まれるページは除く. そのようなページの場合は, ALLOW-FROM のサポートが主要なブラウザで行なわれたらALLOW-FROM の利用も検討する.
新たにサイトを構築する場合は CSP (Content Security Policy) の利用を検討する.
HTTP と HTTPS を併用している場合は, HTTP Strict Transport Security の利用を検討する.
要件によりIPアドレス制限をする場合は, 攻撃者によるIPアドレスの偽装が困難な方式でIPアドレスを取得しなければならない.