Topiqlo ロゴ

セキュアコーディング

公開日: 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つずつチームに浸透させていきましょう。