Webセキュリティ入門:HTTP・Cookie・脆弱性
完全性(Integrity)とは
この回でやること
完全性とは、情報と処理が許可なく変わらない状態です。値の決定権を誰が持つかという考え方を学びます。
- 読む 約 5 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
完全性は、CIAの2つ目で、情報と処理が許可なく変わらない状態を指します。この回では、それが崩れる形を並べ、守るための問いを1つ手に入れます。
読み終えるころには、届いた値を使ってよいかどうかを、ひとつの問いで判断できるようになります。
完全性とは勝手に変わらないこと
Integrity(完全性) は、情報や処理が正しく保たれ、許可なく変更されていない状態です。
対象は保存されたデータだけではありません。計算の過程も完全性の対象です。データベースの数字が書き換えられていなくても、合計の出し方が操作できるなら、完全性は損なわれています。
崩れる形
保存された値が変わる。 残高、点数、権限、公開状態。直接書き換えられる場合です。
計算に使う値が変わる。 これが実務でよく見る形です。保存されているデータは正しいのに、計算に使う値を外から差し込める。価格をリクエストから受け取って合計を出すのが典型例です。
処理の順番を飛ばせる。 支払いを済ませずに完了画面へ進める、承認を経ずに公開状態にできる。個々の画面は正しく動いていても、順番の確認が無ければ結果は壊れます。
他人になりすます。 操作した人の記録が実際と食い違う状態も、完全性の問題です。
同じ操作が二重に効く。 送信ボタンの二度押しで注文が2件立つ、通信の再送で残高が二重に減る。
保存されている値がすべて正しくても、その値の使い方を外から決められるなら、結果は正しくありません。
値の決定権を問う
完全性を守るうえで、いちばん効く問いは次のものです。
この値は、誰が決めるべきか。
利用者が決めてよい値と、サーバーが決めるべき値があります。
- 利用者が決めてよい。 買う商品、数量、届け先、コメントの本文
- サーバーが決めるべき。 価格、割引率、権限、他人の識別子、作成日時、注文の状態
届いたからといって、使わなければなりません、ということにはなりません。サーバーが決めるべき値は、リクエストに入っていても無視するのが正解です。拒否ではなく無視である点が大事です。特定の値だけを弾く形にすると、弾いていない値で同じことが起きます。
記録が残ることも完全性のうち
誰が、いつ、何を変えたか。この記録が残っていないと、変更が正しかったのかを後から確かめられません。
記録そのものが書き換えられないことも要ります。あとから都合よく直せる記録は、記録として役に立ちません。