外部入力を信頼しない
ユーザー入力、ファイル、ネットワーク、環境変数など、プログラムの外から届く値は想定どおりとは限りません。値を利用する前に、用途に応じて検証します。
型と範囲を分けて確認する
using System;
class Program
{
static void Main()
{
string? input = Console.ReadLine();
if (int.TryParse(input, out int quantity) &&
quantity >= 1 &&
quantity <= 100)
{
Console.WriteLine("受付可能です。");
}
else
{
Console.WriteLine("1から100までの整数を入力してください。");
}
}
}
TryParseで整数に変換できることと、数量として許可できる範囲にあることは別々に確認しています。
入力検証の観点
- 型:整数、日付など、必要な型に変換できるか。
- 範囲:最小値・最大値の範囲内か。
- 長さ:文字列やデータサイズが上限を超えていないか。
- 形式:アプリケーションが受け付ける形式か。
- 文脈:その操作で使ってよい値か。
検証に失敗したら
不正な値を既定値として黙って処理すると、利用者が誤りに気付けないことがあります。安全に処理を中止するか、再入力を促すなど、仕様に沿った動作を選びます。
セキュリティの基本原則
入力検証は重要ですが、それだけですべての脆弱性を防げるわけではありません。データベース、ファイル、HTMLなど、値を使う先に応じた安全なAPIや出力処理も必要です。これらはExpert以降で詳しく扱います。