【2026年版】サイバーセキュリティ入門|エンジニアが知っておくべき脅威・対策・セキュリティツール完全ガイド

サイバー攻撃は年々巧妙化しており、エンジニアも「セキュリティは専門家に任せる」時代は終わりました。本記事では、Webエンジニアが現場で知っておくべきサイバーセキュリティの基礎知識から実践的な対策、おすすめツールまで体系的に解説します。

エンジニアが直面するサイバーセキュリティの脅威トップ10

OWASP(Open Web Application Security Project)が定期的に更新する「OWASP Top 10」は、Webアプリケーションの主要な脆弱性をまとめたものです。2026年版のトップ脅威を解説します。

  • 1. アクセス制御の破損(IDOR・権限昇格):適切な認可チェックの欠如
  • 2. 暗号化の失敗:機密データの平文保存・脆弱な暗号化
  • 3. インジェクション(SQLi・XSS・コマンドインジェクション)
  • 4. 安全でない設計:脅威モデリングの欠如
  • 5. セキュリティ設定ミス:デフォルト設定のまま運用
  • 6. 脆弱なコンポーネント:古いライブラリ・フレームワークの使用
  • 7. 認証・セッション管理の欠陥
  • 8. ソフトウェア・データの整合性の失敗:CI/CDパイプラインへの攻撃
  • 9. セキュリティログ・監視の失敗
  • 10. SSRFサーバーサイドリクエストフォージェリ

SQLインジェクション対策:安全なデータベースクエリ

// ❌ 危険:SQLインジェクションに脆弱
const userId = req.params.id; // 攻撃者が "1 OR 1=1" を入力
const query = `SELECT * FROM users WHERE id = ${userId}`;
// 実行されるSQL: SELECT * FROM users WHERE id = 1 OR 1=1
// 全ユーザーデータが漏洩!

// ✅ 安全:プリペアドステートメント(Node.js + PostgreSQL)
const { rows } = await pool.query(
  'SELECT * FROM users WHERE id = $1',
  [userId] // パラメータとして渡すことでエスケープ
);

// ✅ ORMを使う(Prisma例)
const user = await prisma.user.findUnique({
  where: { id: parseInt(userId) }
});

// ✅ バリデーション(zod使用)
import { z } from 'zod';

const userIdSchema = z.string().uuid();
const validatedId = userIdSchema.parse(req.params.id); // 不正な値はエラー

XSS(クロスサイトスクリプティング)対策

// ❌ 危険:ユーザー入力をそのままHTMLに挿入
document.getElementById('output').innerHTML = userInput;
// userInputが "" だと被害発生

// ✅ 安全:テキストノードとして挿入(エスケープ)
document.getElementById('output').textContent = userInput;

// ✅ DOMPurifyでサニタイズ(HTMLが必要な場合)
import DOMPurify from 'dompurify';
element.innerHTML = DOMPurify.sanitize(userInput);

// Content Security Policyヘッダーの設定(Next.js/Express)
// headers.js (Next.js)
const securityHeaders = [
  {
    key: 'Content-Security-Policy',
    value: "default-src 'self'; script-src 'self' 'unsafe-inline' https://www.googletagmanager.com; img-src 'self' data: https:; style-src 'self' 'unsafe-inline';"
  },
  {
    key: 'X-Frame-Options',
    value: 'SAMEORIGIN'
  },
  {
    key: 'X-Content-Type-Options',
    value: 'nosniff'
  },
  {
    key: 'Referrer-Policy',
    value: 'strict-origin-when-cross-origin'
  },
  {
    key: 'Permissions-Policy',
    value: 'camera=(), microphone=(), geolocation=()'
  }
];

認証・認可のセキュアな実装

import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';

// ✅ パスワードのハッシュ化(bcrypt)
async function hashPassword(password: string): Promise<string> {
  const saltRounds = 12; // コスト係数(高いほど安全・遅い)
  return bcrypt.hash(password, saltRounds);
}

async function verifyPassword(password: string, hash: string): Promise<boolean> {
  return bcrypt.compare(password, hash);
}

// ✅ JWTの安全な実装
function generateTokens(userId: string) {
  const accessToken = jwt.sign(
    { userId, type: 'access' },
    process.env.JWT_SECRET!,
    { expiresIn: '15m' } // アクセストークンは短命に
  );
  
  const refreshToken = jwt.sign(
    { userId, type: 'refresh' },
    process.env.JWT_REFRESH_SECRET!,
    { expiresIn: '7d' }
  );
  
  return { accessToken, refreshToken };
}

// ✅ レート制限(express-rate-limitを使用)
import rateLimit from 'express-rate-limit';

const loginLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分
  max: 5, // 最大5回の試行
  message: 'ログイン試行回数が多すぎます。15分後に再試行してください。',
  standardHeaders: true,
  legacyHeaders: false,
});

環境変数と秘密情報の管理

  • 絶対にGitにシークレットをコミットしない:.gitignoreに.envを追加
  • 本番環境ではシークレット管理サービスを使用:AWS Secrets Manager、GCP Secret Manager、HashiCorp Vault
  • 環境ごとに異なるシークレットを使用:開発・ステージング・本番で別々のキーを設定
  • シークレットローテーション:定期的にAPIキーやパスワードを更新する仕組みを作る

おすすめのセキュリティツール

  • OWASP ZAP:無料のWebアプリケーション脆弱性スキャナー
  • Burp Suite:プロ向けの侵入テストツール
  • Snyk:依存関係の脆弱性を自動検知・修正提案
  • Dependabot(GitHub Actions):自動的に脆弱なライブラリのPRを作成
  • SonarQube:静的コード解析でセキュリティ問題を早期発見
  • Trivy:Dockerイメージの脆弱性スキャン

まとめ:セキュリティはコードと同様に設計段階から

セキュリティは「後付け」ではなく、設計段階から取り込む「セキュリティバイデザイン」のアプローチが重要です。OWASP Top 10を定期的に確認し、コードレビューでセキュリティチェックを習慣化することから始めましょう。

投稿者 kasata

IT企業でエンジニアとして勤務後、テクノロジー情報メディア「Tech Athletes(テック・アスリート)」を運営。プログラミング、クラウドインフラ(AWS/GCP/Azure)、AI活用、Webサービス開発を専門とする。エンジニア・ビジネスパーソン向けに、実際に使ってみた経験をもとに信頼できる技術情報を発信中。資格:AWS認定ソリューションアーキテクト、Python 3 エンジニア認定試験合格。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です