セキュアコーディング - セキュアコーディングの基本
安全なコードを書くための基本原則。入力検証・最小権限・エラーハンドリングの3原則で大半の脆弱性を防止できる。
概念図
実例
入力検証の実装例
bash
// 入力検証(ホワイトリスト方式)
const ALLOWED = /^[a-zA-Z0-9_]{1,30}$/;
if (!ALLOWED.test(username)) {
throw new ValidationError("Invalid username");
}エラーハンドリングの実装例
bash
// エラーハンドリング
try {
await processRequest(req);
} catch (err) {
logger.error("Request failed", { requestId, error: err });
res.status(500).json({ error: "Internal error" });
// スタックトレースはユーザーに返さない
}セキュアコーディング 3 原則
| 入力検証 | 最小権限 | エラーハンドリング | |
|---|---|---|---|
| 概要 | すべての外部入力を信頼しない。型・長さ・形式・範囲を検証する | コードやプロセスの権限を必要最小限に留める | エラー情報の露出を防ぎ、監査ログを適切に記録する |
| 手法 | ホワイトリスト方式(許可パターンを定義)、出力先に応じたエスケープ | DB ユーザーの読取専用化、ファイルアクセス制限、API スコープ最小化 | スタックトレース非公開、認証の成功/失敗をログ記録、機密情報をログに含めない |
| 防げる攻撃 | XSS、SQL インジェクション、コマンドインジェクション | 権限昇格、横展開、大規模データ漏洩 | 情報漏洩(エラーメッセージ経由)、インシデント見逃し |
| ポイント | 入力検証と出力エスケープの 2 つで大半の脆弱性を防止できる | 万が一突破されても被害範囲を限定できる | ユーザーには最小限の情報、内部には十分なログを残す |
