セキュアコーディング
公開日: 2025/06/03
セキュアコーディング:脆弱性を作らない安全なコードの書き方
はじめに
サイバー攻撃の多くは、開発者のちょっとしたミスに起因します。
セキュリティテストやWAFも大切ですが、最も効果的なのは「そもそも脆弱性を生まないコードを書くこと」――それがセキュアコーディングです。
本記事では、あらゆる言語・フレームワークで共通するセキュアコーディングの原則と具体例を紹介します。
基本情報・概要
セキュアコーディングとは、セキュリティリスクを考慮して安全な実装を行うことです。
ソフトウェア開発の初期段階からセキュリティを組み込み、実装時点で脆弱性の混入を防ぐための開発手法の一部です。
- OWASP Top 10やCERTガイドラインをベースにすることが多い
- 脅威ベースでなく「原則ベース」で考える
- 誰でもすぐ実践できる防御策が多数存在する
比較・分類・特徴の表形式まとめ
セキュア原則 | 内容・目的 |
---|---|
入力値の検証 | ユーザー入力は必ずバリデーション(型・範囲・形式) |
出力時のエスケープ | HTML/JS/SQLなど出力先に応じたエスケープ処理 |
認証・認可の分離 | ログインの認証と、操作の権限(認可)を別に実装する |
例外処理の明示化 | スタックトレースを公開しない、安全なエラーハンドリング |
最小権限の原則 | DB接続やファイル操作は最低限の権限で行う |
デフォルトは拒否 | 許可しない限り拒否(Deny by Default)を基本とする |
深掘り解説
-
入力値の検証(JavaScriptの例):
const userId = req.body.userId; if (typeof userId !== "string" || userId.length > 32) { return res.status(400).send("Invalid input"); }
-
XSS対策(Reactの場合):
// 悪い例
<div dangerouslySetInnerHTML={{ __html: userInput }} />// 良い例
<div>{sanitize(userInput)}</div> -
SQLインジェクション対策(Node.js + pg):
const result = await client.query( "SELECT * FROM users WHERE id = $1", [userId] );
-
例外処理:
try { const user = await getUser(id); } catch (err) { logger.error("User fetch failed", err); res.status(500).send("Internal error"); }
応用・発展的な使い方
- 静的解析ツールとの併用(ESLint, SonarQube, Bandit等)
- セキュアコーディング規約の整備(社内スタイルガイドに組み込み)
- 自動テストで脆弱性ケースもカバー
- 教育の定期実施:新人研修やレビュー基準にも組み込むと効果的
よくある誤解と注意点
- 「セキュア=複雑」ではない:多くは基本的な注意の積み重ね
- 「フレームワークが守ってくれる」過信は禁物:React/VueでもXSSは可能
- 「レビューで見つけてもらえばいい」では遅い:書く段階で防ぐのが理想
まとめ
セキュアコーディングは、攻撃される前に防ぐ最もコスパの良いセキュリティ対策です。
テストや対策ツールの前に、「書く人間の意識」が何より重要。小さな防御の積み重ねが、大きな事故を防ぎます。
今日からできるセキュア実装を、1つずつチームに浸透させていきましょう。