セキュリティ: 守りの技術
C言語は「デフォルトで脆弱」だ。getsを使うな。サイズを確認しろ。
バッファオーバーフロー
用意したメモリ(コップ)よりも多くのデータ(水)を入れてしまい、隣のメモリ(机)を汚してしまうこと。脆弱性の王様。
入力検証
外部からの入力(ユーザー入力、ファイルなど)を信じず、長さや形式をチェックすること。
C言語はナイフ
C言語はメモリを直接操作できる強力なツールですが、安全装置が一切ありません。配列の境界チェックもしてくれません。
特に危険なのが「バッファオーバーフロー」です。入力データのサイズチェックを怠ると、悪意のあるユーザーが巨大なデータを送り込み、プログラム乗っ取り(シェルコード実行)が可能になります。
オーバーフローの罠
Danger: gets() 関数は「使用禁止」です。入力の長さを制限できないため、100%脆弱になります。コンパイラも警告を出します。
// ❌ 脆弱なコードchar buf[10];// 10文字以上入力されるとメモリがあふれる!gets(buf);scanf("%s", buf);安全な書き方
必ず「最大読み込みサイズ」を指定できる関数を使います。
// ✅ 安全なコードchar buf[10];
// サイズを指定して読み込む// fgetsは sizeof(buf)-1 文字までしか読まないfgets(buf, sizeof(buf), stdin);演習課題
課題1: fgets
scanf("%s") を使っているコードを、fgets を使うように書き換えて安全にしてください。
合格ライン
gets()を使ってはいけない理由を説明できる
入力は常に疑い、サイズ制限をかける癖がついている