Webセキュリティ入門:HTTP・Cookie・脆弱性
認可(Authorization)とは
この回でやること
認可(Authorization)とは「してよいか」を決める工程です。認証を通したあとに毎回必要になる点が認証との違いです。
- 読む 約 5 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
認可は、誰であるかが分かったあとに「この操作をしてよいか」を決める工程です。ログイン済みなら通してよい、という判断のどこが抜けているかを見ます。
読み終えるころには、認証を通っていることと、その操作をしてよいことは別だと説明できます。
誰かが分かったあとの話
認証で「誰であるか」が分かりました。認可はその次に、その人がこの操作をしてよいかを決めます。
- ログイン済みである(認証)
- しかし他人の注文は見られない(認可)
この2つは別々の判断です。ログインしていることは、何をしてもよいことを意味しません。
見落とされやすい形
認可の抜けは、次の形で現れます。
他人のものが見えてしまう。 /orders/1001 を /orders/1002 に変えると他人の注文が出る。番号を変えただけです。
強い権限の画面に入れてしまう。 管理画面のURLを知っていれば開ける。画面にリンクを出していないだけで、経路は開いている。
画面では止めているが、APIは開いている。 ボタンを隠しても、その先のAPIを直接呼べば通る。
リンクを出さない、ボタンを消す、URLを推測しにくくする。どれも見つけにくくするだけで、できなくするわけではありません。判断はサーバー側で毎回行います。
判断の材料をどこから取るか
ここを間違えると全部崩れます。
誰であるかは、セッションから引きます。要求に含まれる userId や role からは引きません。書き換えられるからです。
対象は誰のものかは、データベースから引きます。要求に付いてきた所有者情報は使いません。
そのうえで、この2つを突き合わせます。要求の中の値だけで判断が完結しているなら、そこが抜け穴です。
毎回確かめる
HTTP は前回を覚えていません。一覧で確認したから詳細では省く、という作りにすると、詳細を直接呼ばれたときに素通りします。入り口ごとに確かめます。