コース目次 / 第3章

原則3 — 状態と身元を、正しく守る

sec-authとsec-logicで学んだ、セッション・事実の所在・確認と実行の一体化を体系化します。「サーバが正とする」「意図を確かめる」「隙間を作らない」の3つの実装パターンに整理します。

第3章 / 全6章目安 約11分この章のゴール: 状態と身元を守る具体策を体系立てて言えるようになる

sec-auth と sec-logic では、「あなたが誰か」「あなたに何が起きるか」を扱いました。ここにも、繰り返し現れた原則があります。

事実は、サーバが持つ

IDOR の修正(sec-authz)——「この資源は本人のものか」を、サーバが資源を返す直前に確認した。
価格改ざんの修正(sec-logic)——「いくらか」という事実を、クライアントではなくサーバのカタログから引いた。
セッションの正当性(sec-auth)——「ログインしているか」を、Cookie の値そのものではなく、サーバが管理するセッションの記録と照合した。
どれも同じ形です——クライアントから届く値は「参照」であって「事実」ではない。事実は、常にサーバ側の記録を正とする。

意図を、確かめる

CSRFトークン(sec-auth)——攻撃者には作れない合言葉で、「この操作が正規の画面から送られたか」を確認した。
OAuth の state(sec-auth)——攻撃者には知りえない値で、「このログインは自分が開始したフローか」を確認した。
状態を変える操作(お金が動く・権限が変わる・データが書き換わる)には、「これは利用者が本当に意図したものか」を確かめる仕組みを挟む、という共通の発想でした。

確認と実行を、隙間なく行う

セッション固定の修正(sec-auth)——ログイン前後でIDを使い回さず、成功の瞬間に必ず再生成した。
TOCTOU の修正(sec-logic)——「在庫があるか確認」と「在庫を減らす」の間に、他の処理が割り込む隙間を作らなかった。
どちらも「確認した状態と、実行する状態が、途中で変わってしまう隙間」を塞ぐという、同じ形をしています。

この原則の、確かめ方

「この値(価格・在庫・権限・ログイン状態)は、誰が“正しい”と保証しているか?」——クライアントの申告なら疑う。
「この操作は、それを意図した人だけが行えるか?」——推測できる値だけで実行できるなら疑う。
「確認してから実行するまでに、時間や処理の隙間はないか?」——あれば、その隙間に別の処理が割り込めないかを疑う。

持ち帰る一言

事実はサーバに、操作には意図の確認を、確認と実行は隙間なく。 セッション・価格・在庫・認可——扱う対象は違っても、守り方の骨格は同じでした。次は、これらの原則が「破れたとき」に備える、最後の一枚——多層防御です。

こうなっていればOK

卒業まであと2章です。

この章はまだ完了していません。