他人のデータを見られる穴を防ぐ権限の仕組みを、どう作りますか

画面から来た ID を信じず、データを取る問い合わせそのものに「いまの利用者の物か」の条件を入れ、許すと決めた物以外は断る、と答える問い。権限の判断を 1 か所にまとめる作りと、別の利用者で試す確かめ方まで話します。

まず 4 択で考える

2 問

答えに入れるべき考えを選びます。選ぶと、すぐに正誤と解説が出ます。そのあと下の欄で、自分の言葉で答えてみます。

  1. 問 1URL の注文の番号を変えると他人の注文が見える穴の直し方として、正しいものはどれか

  2. 問 2権限の判断の既定の置き方として、正しいものはどれか

2 問中 0 問に答えました

答えてみる

面接官に「他人のデータを見られる穴を防ぐ権限の仕組みを、どう作りますか」と聞かれたつもりで、答えを見る前に自分の言葉で、声に出して答えてみます。

解説を読む

聞かれ方から関連するコースまで、この問いの解説を全部ここに置いています。

こう聞かれます

  • 「他人のデータを見られる穴を防ぐ権限の仕組みを、どう作りますか」
  • 「URL の /orders/123 の数字を 124 に変えたら、他人の注文が見えてしまいました。どう直しますか」
  • 「画面に他人のボタンを出さなければ、十分ではないですか」(裏から聞く形)

面接官が見ている点

  • ログインしているか (認証) と、その物を触ってよいか (認可) を分けて考えられるか
  • 画面から来た ID や役割を信じず、サーバーで毎回確かめるか
  • 確かめ忘れが起きにくい作り (問い合わせに条件を入れる、判断を 1 か所に集める) にしているか
  • 別の利用者で試して、穴が無いことを確かめるか

短い答え

  • 画面や URL から来た ID は信じず、サーバーで毎回「いまの利用者が、この物を触ってよいか」を確かめます。ログインしているかだけでは足りません。
  • 確かめ忘れが起きないよう、データを取る問い合わせそのものに「持ち主がいまの利用者」の条件を入れ、誰が何をしてよいかの判断は 1 か所にまとめます。許すと決めた物以外は断ります。
  • 別の利用者の ID や鍵で同じ API を叩く試験を用意し、他人の物が返らないことを確かめ続けます。

この問いを含む分野をレッスンで練習する

レッスンを開く

少し詳しい答え

なぜ穴ができるか

ログインの確かめはどの API にも入れやすいのに、「この注文はこの人の物か」の確かめは、API ごとに書く必要があります。1 つでも書き忘れると、ID の数字を変えるだけで他人のデータが見えます。API の穴の中でも特に多い種類です。

画面にボタンを出さないのは、見た目の話でしかありません。API は画面を通さず直接叩けるので、守りは必ずサーバーに置きます。

問い合わせに持ち主の条件を入れる

取ってから確かめるのではなく、取るときに条件を入れると、書き忘れが起きにくくなります。

JavaScript

const orders = [
  { id: 1, ownerId: "alice", item: "本" },
  { id: 2, ownerId: "bob", item: "靴" },
];

function getOrderUnsafe(orderId) {
  return orders.find((o) => o.id === orderId) ?? null;
}

function getOrder(currentUser, orderId) {
  const order = orders.find(
    (o) => o.id === orderId && o.ownerId === currentUser.id
  );
  if (!order) {
    return { status: 404 };
  }
  return { status: 200, item: order.item };
}

const alice = { id: "alice" };

console.log(getOrderUnsafe(2).item);
console.log(getOrder(alice, 1));
console.log(getOrder(alice, 2));
console.log(getOrder(alice, 999));
靴
{ status: 200, item: '本' }
{ status: 404 }
{ status: 404 }

getOrderUnsafe は、ID だけで探すので、alice が bob の注文を見られます。getOrder は、持ち主の条件を探す条件に入れています。currentUser は画面から来た値ではなく、サーバーがログインの情報から決めた利用者です。

他人の注文と、無い注文に、同じ 404 を返している点も大事です。403 と 404 を分けると、「その番号の注文はある」と外に教えてしまいます。

SQL で書くなら、次のように条件に入れます。

SQL クエリ

SELECT * FROM orders WHERE id = $1 AND owner_id = $2;

判断を 1 か所にまとめる

役割 (管理者、店の人、一般の人) や、チームで共有する物が出てくると、条件は複雑になります。「誰が、何に、何をしてよいか」の判断を 1 つの関数や仕組みにまとめ、各 API はそれを呼ぶだけにします。ルールが散らばると、直すときに 1 か所だけ漏れます。

判断の既定は「断る」にします。新しい API や役割を足したとき、許す設定を書き忘れても、開いてしまうのではなく、閉じたままになるからです。与える権限は、その仕事に要る最小限にします。

別の利用者で試す

利用者 A で作ったデータを、利用者 B の鍵で読む、書く、消す、の試験を API ごとに用意します。自動の試験に入れておくと、新しい API で書き忘れたときにすぐ気づけます。

話すときは、自分が作った API で、権限の確かめをどこに置き、どう試したかの例を 1 つ用意します。話す例は架空の例で構いません。

よくある間違い

  • ログインしているかだけを確かめるログインした人なら誰でも、ID を変えて他人のデータを見られます
  • 画面から送られた利用者の ID や役割を信じる送る値は書き換えられます。利用者はサーバーがログインの情報から決めます
  • 画面にボタンを出さないことで守ったつもりになる API は直接叩けます。守りはサーバーに置きます
  • 権限の確かめを API ごとにばらばらに書く 1 か所の書き忘れが、そのまま穴になります

深掘りの問い

  • 「ID を推測しにくい乱数の文字列にすれば安全ではないですか」当てにくくはなるが、ID が漏れれば見えるので、持ち主の確かめは別に要る、と答えます
  • 「一覧の API では、どう守りますか」 一覧の問い合わせにも持ち主やチームの条件を必ず入れ、検索の条件は画面から来た値で広げられないようにする、と答えます
  • 「管理者の画面は」管理者の操作は別の入口と強い確かめにし、誰が何を見たかを記録に残す、と答えます

確認日 2026年10月30日書き手 小尾 知希 (講師)

技術面接問題の一覧へ戻る