【2026年版】Webセキュリティ完全ガイド|OWASP Top 10・脆弱性対策・セキュアコーディングを実践解説

Webアプリケーションのセキュリティ対策は、すべてのエンジニアが身につけるべき必須スキルです。本記事ではOWASP Top 10に基づき、2026年現在も依然として多いWebアプリの脆弱性と対策を実践的に解説します。

OWASP Top 10(2026年版)

  • A01: アクセス制御の破損(最も多い脆弱性)
  • A02: 暗号化の失敗(データ漏洩の主原因)
  • A03: インジェクション(SQLインジェクション・コマンドインジェクション)
  • A04: 安全でない設計
  • A05: セキュリティの設定ミス
  • A06: 脆弱なコンポーネント
  • A07: 認証と認可の失敗
  • A08: ソフトウェアとデータの整合性の失敗
  • A09: セキュリティログと監視の失敗
  • A10: サーバーサイドリクエストフォージェリ(SSRF)

SQLインジェクション対策

// ❌ 脆弱なコード(SQLインジェクションに弱い)
const query = `SELECT * FROM users WHERE email = '${email}' AND password = '${password}'`;

// ✅ 安全なコード(プレースホルダを使用)
const query = 'SELECT * FROM users WHERE email = ? AND password = ?';
const [rows] = await db.execute(query, [email, hashedPassword]);

// ✅ ORMを使用(Prisma例)
const user = await prisma.user.findFirst({
  where: {
    email: email,
    password: hashedPassword
  }
});

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

// ❌ 脆弱なコード
document.innerHTML = userInput;

// ✅ 安全なコード(エスケープ処理)
function escapeHtml(str) {
  return str
    .replace(/&/g, '&')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&'');
}
document.textContent = userInput; // textContentは自動エスケープ

// Content Security Policy (CSP) ヘッダーの設定
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-{random}'; style-src 'self' 'unsafe-inline'

CSRF(クロスサイトリクエストフォージェリ)対策

// Express.jsでのCSRF対策
import csrf from 'csurf';

const csrfProtection = csrf({ cookie: true });

// GETリクエストでトークンを発行
app.get('/form', csrfProtection, (req, res) => {
  res.render('form', { csrfToken: req.csrfToken() });
});

// POSTリクエストでトークンを検証
app.post('/submit', csrfProtection, (req, res) => {
  // CSRF検証は自動的に行われる
  // ...処理
});

// SameSite Cookieの設定(モダンなCSRF対策)
res.cookie('sessionId', token, {
  httpOnly: true,
  secure: true,
  sameSite: 'strict'
});

認証のベストプラクティス

  • パスワードのハッシュ化:bcrypt(コスト係数12以上)を使用する
  • 多要素認証(MFA):TOTP(Google Authenticator)の実装を推奨
  • JWTのセキュリティ:短い有効期限・リフレッシュトークン・署名アルゴリズムはRS256を使用
  • ブルートフォース対策:レートリミット・アカウントロック・reCAPTCHAの実装
  • セッション管理:ログアウト時のセッション無効化・Secure/HttpOnly Cookieの使用

セキュリティヘッダーの設定

// Helmetを使ったExpressのセキュリティヘッダー設定
import helmet from 'helmet';
app.use(helmet());

// 主要なセキュリティヘッダー
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Content-Security-Policy: default-src 'self'
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: geolocation=(), microphone=(), camera=()

定期的なセキュリティ対策

  • 依存関係の脆弱性スキャンnpm auditを定期実行。Dependabotの活用
  • HTTPS必須:Let’s Encryptで無料SSL証明書を取得
  • ログ監視:異常なアクセスパターンをCloudWatch/Datadogで監視
  • ペネトレーションテスト:定期的な脆弱性診断の実施

クラウド環境のセキュリティも重要です。AWSのセキュリティ設定についても参照してください。

投稿者 kasata

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

コメントを残す

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