前回との接続とこの講義の役割

前回のQ-05では、ロール・操作・行という3つの粒度で「してよいこと」を制御しました。今回は、その手前にある「受け取った値そのものをどう扱うか」に進みます。認可で操作を絞っても、届いた入力を無防備に使えば事故は起きます。この講義は、次回Q-07で学ぶ代表的な攻撃3種に共通する、防ぎ方の土台にあたる回です。
このスライドのポイント
- Q-05: ロール・操作・行の3粒度で「してよいこと」を制御した
- 今回はその手前、「受け取る値そのものをどう扱うか」に進む
- Q-07で学ぶ代表的な攻撃3種に共通する、防ぎ方の土台にあたる回
検証と無害化の2段

大原則は、外部から届く入力はすべて信用しない、です。これはJ-06で学んだ信頼境界を、セキュリティの言葉で言い直したものです。対処は2段あります。1段目は検証で、受け入れてよい形かを確かめます。長さ・型・範囲など、J-06の6点の観点で不正な値を弾きます。2段目は無害化、別名エスケープです。データを表示や命令に使うとき、特別な意味を持つ文字を無効化して、ただの文字列として扱わせます。検証をすり抜けた値も、無害化があれば命令としては作動しません。
このスライドのポイント
- 大原則「外部からの入力はすべて信用しない」=J-06の信頼境界のセキュリティ版
- 検証=受け入れてよい形か確かめる(長さ・型・範囲。J-06の6点の観点)
- 無害化(エスケープ)=特別な意味を持つ文字を無効化し、ただの文字列として扱わせる
- 検証をすり抜けた値も、無害化があれば「命令」として作動しない
なぜ2段が必要か

なぜ2段が必要なのでしょうか。次回Q-07で扱う代表的な攻撃は、いずれも「入力が命令として作動してしまう」事故です。この2段を知らないと、その防ぎ方が分かりません。そしてH-05で一度潰したはずの「画面でチェックしているから大丈夫」という誤解も、ここで完全に退治します。画面側のチェックは利用者の利便のためであって、守りではありません。守りはサーバー側の検証と、使う場所での無害化にあります。
このスライドのポイント
- Q-07の攻撃3種は、いずれも「入力が命令として作動する」事故
- 2段を知らないと、その防ぎ方が分からない
- H-05で潰した「画面でチェックしているから大丈夫」の誤解を完全に退治する
- 画面側のチェックは利用者の利便のため。守りはサーバー側の検証と、使う場所での無害化
入口と出口の2つの関所

守りの全体像は、入口と出口の2段の関所です。入口の関所が検証で、届いた値が受け入れてよい形かを確かめます。出口の関所が無害化で、その値を表示したり命令に使ったりする直前に、特別な文字の牙を抜きます。片方だけでは足りません。検証だけでは、自由な記述を許す欄を守れません。無害化だけでは、そもそも不正な形の値をため込んでしまいます。入口と出口の両方に関所を置くことが鍵です。
このスライドのポイント
- 守りの全体像は、入口と出口の2段の関所
- 入口の関所=検証(届いた値が受け入れてよい形か確かめる)
- 出口の関所=無害化(表示・命令に使う直前に特別な文字の牙を抜く)
- 片方だけでは足りない。入口と出口の両方に関所を置くのが鍵
経費アプリでの流れ

経費アプリで考えます。備考欄に、画面を操作しようとする文字列が書き込まれたとします。検証は、長さや型だけを見ていれば、その値を通してしまうかもしれません。ここで守るのが出口の無害化です。表示するときに無害化されていれば、その文字列は命令ではなく、ただの文字として画面に出るだけです。他人の申請を見る画面を巻き込む事故を、攻撃の名前を出す前に、構造として防げるわけです。責任範囲は、検証がサーバー側、無害化が表示や保存の各出口にあります。
このスライドのポイント
- 備考欄に、画面を操作しようとする文字列が書き込まれたとする
- 検証は長さや型だけを見ていれば通してしまうかもしれない
- 表示時に無害化されていれば、その値は命令ではなく、ただの文字として出るだけ
- 責任範囲: 検証はサーバー側、無害化は表示・保存の各出口
技術サンプル: 入力の旅と2つの関所

サンプルは、入力が通る道と2つの関所を示した図です。入力は、まず検証の関所を通って保存され、取り出して表示や命令に使う直前に、無害化の関所を通ります。読み方の要点は2つです。1つは、関所が入口と出口の2か所にあること。もう1つは、現代の枠組み、たとえばI章で見たReactなどは、表示時の無害化を標準で行うことです。だからこそ、その標準を無効化する書き方をAIがしたら危険信号です。AIへの質問例は、入力が表示・保存・検索に使われる箇所を列挙させ、それぞれの無害化の場所を示させるものです。
混同しやすい: 検証と無害化

混同しやすいのは、検証と無害化です。検証は、形を確かめて受け入れられない値を弾く働きです。無害化は、通した値の牙を抜く働きです。検証だけでは、備考のように自由な表現を許したい欄を守れません。長い自由文は、どうしても通すからです。だからその値を使う瞬間に無害化して、命令として作動しないようにします。役割が違うので、両方そろえて初めて守りになります。
バイブコーディングでの確認点

バイブコーディングでの確認点です。AIが書いたコードに、無害化を無効化する書き方、たとえば生のHTMLを直接挿入するような書き方がないかを確認します。もし見つかったら、その理由をAIに問い、正当な理由がなければ修正させます。質問例は、利用者の入力が表示・保存・検索に使われる箇所をすべて挙げさせ、それぞれ無害化がどこで行われているかを示させることです。標準の守りを外していないかを、機械的に点検する習慣にしてください。
このスライドのポイント
- AIのコードに「無害化を無効化する書き方(生のHTML挿入等)」がないか確認する
- 見つかったら理由を問い、正当な理由がなければ修正させる
- 質問例: 利用者の入力が表示・保存・検索に使われる箇所をすべて挙げ、無害化の場所を示させる
まとめと次回

最後に一問一答です。入力対策の2段は何でしょうか。(間)答えは、検証と無害化、別名エスケープです。30秒まとめです。外部の入力はすべて信用しない。入口で検証し、出口で無害化する。H-05で画面のチェックは守りではないと知り、J-06で信頼境界をサーバー側に引き、このQ-06でその境界を検証と無害化の2段で固める。これが縦串の総括です。次回Q-07では、この原則を破るとどうなるか、代表的な攻撃3種を構造から見ます。関連資料は「AIアプリのセキュリティ超入門」「セキュリティ用語50」です。
このスライドのポイント
- 一問一答:「入力対策の2段は?」→ 検証と無害化(エスケープ)
- 30秒まとめ: 外部の入力はすべて信用しない。入口で検証し、出口で無害化する
- 縦串総括: H-05(画面チェックは守りでない)→J-06(信頼境界をサーバー側へ)→Q-06(検証と無害化の2段で固める)
- 次回Q-07: この原則を破るとどうなるか、代表的な攻撃3種を構造から見る
- 関連資料: AIアプリのセキュリティ超入門/セキュリティ用語50