業務用Webアプリで「他人のデータが見える」を防ぐ確認ポイント

業務用Webアプリで「他人のデータが見える」を防ぐ確認ポイント

記事
IT・テクノロジー
こんにちは。
Web・システムエンジニアとして活動しているMasaです。

顧客管理、予約管理、案件管理など、社内や取引先向けの小さなWebアプリを外注や自作で用意するケースが増えています。

ログイン画面があり、IDとパスワードを入れないと使えない仕組みになっていると、「これで安全」と感じるかもしれません。

しかし、ログインの仕組みがあっても、次のような不具合が起きることがあります。

・画面のURLに含まれる番号が変わると、別のお客様の情報が表示される
・一般の利用者が、管理者向けの画面や機能を使えてしまう
・画面では見えないはずのデータが、CSV出力や検索結果には含まれている

これらは、「ログインした人が、どのデータを見てよいか・どの操作をしてよいか」の確認が不足している場合に起こりやすい問題です。

今回は、エンジニアではない方にも確認や外注先への質問に使っていただけるよう、小規模なWebアプリで「他人のデータが見えてしまう」不具合を防ぐための確認ポイントを紹介します。

【目次】


■1.「ログインできる」と「見てよい」は別の確認


最初に押さえておきたいのは、ログインの確認と、見てよいかどうかの確認は別のものだという点です。

専門用語では、次のように呼び分けます。

・認証:利用者が「誰か」を確認すること
・認可:その人が「そのデータに対して、その操作をしてよいか」を確認すること

たとえば会社の建物にたとえると、認証は入口で社員証を確認すること、認可は部屋ごとに入ってよい人かを確認することに近いイメージです。

社員証を持っていても、すべての部屋に入ってよいわけではありません。

Webアプリも同じで、ログイン済みであっても、他人のデータを閲覧・更新してよいとは限りません。

「ログイン機能があります」という説明だけで安心せず、ログインした後に「誰が・どのデータを・どこまで操作できるか」が決められているかを確認しましょう。

■2.URLや番号を変えても、他人の情報が出ないか


業務アプリでは、画面のURLに「顧客番号」「注文番号」などが含まれていることがよくあります。

ここで注意したいのは、URLや画面上の値は、利用者が変更できるという点です。

ブラウザの入力欄、URL、画面に埋め込まれた値などは、利用者側で書き換えられることを前提に考える必要があります。

そのため、「自分の番号しか画面に表示しないから大丈夫」ではなく、別の番号が指定されたときに、サーバー側で「この人が見てよいデータか」を確認して断る仕組みが必要です。

確認するときは、次のような観点で整理するとわかりやすくなります。

・誰が(利用者、担当者、管理者など)
・どのデータに(顧客情報、注文、見積りなど)
・何をするか(閲覧、編集、削除、出力など)
・どんな関係か(自分が登録した、担当している、同じ部署など)
・どんな状態か(公開中、下書き、削除済みなど)

「データの持ち主や担当者は誰か」「その人以外が見たらどうなるか」を、仕様の段階で決めておくことが大切です。

なお、自社で管理していない第三者のサイトでこうした確認を行うことは避けてください。確認は、自社のアプリやテスト環境で、許可された範囲で行います。

■3.一覧・詳細・編集・削除・検索・CSV出力の全部で確認しているか


権限の確認は、画面ごとではなく「データに触れるすべての入口」で必要です。

よくあるのが、詳細画面では確認しているのに、別の入口では確認が抜けているケースです。

確認したい入口の例は次のとおりです。

・一覧画面
・詳細画面
・編集・更新
・削除
・検索
・CSV出力や帳票出力
・管理画面

たとえば、一覧画面には自分の担当分しか表示されないのに、CSV出力では全員分のデータが出力されてしまう、といった状態は見落とされやすいポイントです。

機能を追加したときにも、新しい入口で同じ確認ができているかを見直しましょう。

■4.ボタンを隠すだけで「使えない」ことにしていないか


一般の利用者には管理者用のボタンやメニューを表示しない、という作り方はよくあります。

画面をわかりやすくする工夫としては有効ですが、ボタンを隠すことと、操作を拒否することは別です。

画面にボタンが表示されていなくても、通信の内容を直接送ることで機能を呼び出せる場合があります。

そのため、「表示しない」だけでなく、サーバー側で「この人はこの操作をしてよいか」を確認し、許可されていない場合は断る作りになっているかが重要です。

管理画面についても同様です。

「管理画面のURLは関係者しか知らないから大丈夫」という考え方は避けましょう。URLは、ブックマーク、履歴、共有されたメモなどから他の人に知られることがあります。管理画面は、URLを知っているかどうかではなく、ログインと権限の確認で守ります。

■5.管理者の権限と操作の記録


管理者アカウントは、多くのデータを見たり変更したりできるため、扱いに注意が必要です。

確認しておきたい点は次のとおりです。

・管理者にも、必要な範囲の権限だけを割り当てているか
・全員を「管理者」にしていないか
・権限の変更、データの出力、削除などの操作を記録しているか

たとえば、「データの閲覧だけでよい人」と「利用者の追加や削除まで行う人」を分けられるようにしておくと、誤操作やアカウントの不正利用があったときの影響を抑えやすくなります。

また、操作の記録が残っていれば、後から「いつ・誰が・何をしたか」を確認する手がかりになります。

削除やデータ出力などの重要な操作については、追加の本人確認(多要素認証や再ログインなど)を求める方法も、アプリの用途に応じて検討するとよいでしょう。

■確認するときの表(3人×3項目)


ここまでの内容を、確認用の表にまとめます。

利用者の種類ごとに、「自分のデータ」「他人のデータ」「管理者機能」を使えるかを整理します。

【未ログインの人】
・自分のデータ:拒否
・他人のデータ:拒否
・管理者機能:拒否

【一般の利用者】
・自分のデータ:仕様どおり許可
・他人のデータ:原則拒否
・管理者機能:拒否

【管理者】
・自分のデータ:仕様どおり
・他人のデータ:仕様どおり
・管理者機能:割り当てた役割の範囲だけ許可

外注先に開発を依頼している場合は、「この表の内容をどの画面・機能で確認していますか」と質問するきっかけにも使えます。

あわせて、テスト用のアカウントを利用者の種類ごとに用意しておくと、確認を進めやすくなります。

一度修正した問題が、その後の機能追加で再発することもあります。修正後も同じ確認を繰り返せるよう、確認内容を手順やテストとして残しておくことをおすすめします。

■まとめ


「他人のデータが見えてしまう」不具合は、ログイン機能があるアプリでも起こり得ます。

確認のポイントは次のとおりです。

・ログインの確認と、見てよいかの確認を分けて考える
・URLや番号が変わっても、サーバー側で見てよいかを確認する
・一覧、詳細、編集、削除、検索、CSV出力などすべての入口で確認する
・ボタンを隠すだけでなく、操作そのものを断る
・管理者の権限を必要な範囲に分け、重要な操作を記録する

小規模なアプリでも、顧客情報や取引情報を扱う場合は、公開前や機能追加のタイミングで一度整理しておくと安心です。

自社のWebアプリの権限設計や実装について第三者の確認を検討されている場合は、ココナラで「Webアプリをセキュリティ観点でレビューします」を出品しています。ソースコードや設定をもとに、認証・権限まわりを中心に懸念点と改善案を報告書にまとめます。対応できる構成や範囲は、見積り相談からお気軽にお問い合わせください。

※本記事は一般的な確認ポイントを紹介するものです。アプリの構成や要件によって必要な対策は異なり、ここで紹介した確認だけで安全性を保証できるものではありません。
サービス数100万件のスキルマーケット、あなたにぴったりのサービスを探す