セキュリティ: 守りの技術

C言語は「デフォルトで脆弱」だ。getsを使うな。サイズを確認しろ。

バッファオーバーフロー
用意したメモリ(コップ)よりも多くのデータ(水)を入れてしまい、隣のメモリ(机)を汚してしまうこと。脆弱性の王様。
入力検証
外部からの入力(ユーザー入力、ファイルなど)を信じず、長さや形式をチェックすること。
城門の衛兵 (The Fortress Gate)

セキュリティは「城門の衛兵」です。 `gets()` 関数は「衛兵のいない開けっ放しの門」です。10人しか入れない部屋に、1000人の軍隊(悪意あるデータ)が押し寄せたら、城は簡単に占領(乗っ取り)されてしまいます(バッファオーバーフロー)。 `fgets()` のような安全な関数は「人数をカウントする衛兵」です。「ここは10人までしか入れません」と止めれば、あふれることはありません。

C言語はナイフ

C言語はメモリを直接操作できる強力なツールですが、安全装置が一切ありません。配列の境界チェックもしてくれません。

特に危険なのが「バッファオーバーフロー」です。入力データのサイズチェックを怠ると、悪意のあるユーザーが巨大なデータを送り込み、プログラム乗っ取り(シェルコード実行)が可能になります。

オーバーフローの罠

Danger: gets() 関数は「使用禁止」です。入力の長さを制限できないため、100%脆弱になります。コンパイラも警告を出します。
Vulnerable Code
// ❌ 脆弱なコード
char buf[10];
// 10文字以上入力されるとメモリがあふれる!
gets(buf);
scanf("%s", buf);

安全な書き方

必ず「最大読み込みサイズ」を指定できる関数を使います。

Safe Code
// ✅ 安全なコード
char buf[10];
// サイズを指定して読み込む
// fgetsは sizeof(buf)-1 文字までしか読まない
fgets(buf, sizeof(buf), stdin);

演習課題

課題1: fgets
scanf("%s") を使っているコードを、fgets を使うように書き換えて安全にしてください。

合格ライン

gets()を使ってはいけない理由を説明できる
入力は常に疑い、サイズ制限をかける癖がついている