サイバー攻撃は年々巧妙化しており、エンジニアも「セキュリティは専門家に任せる」時代は終わりました。本記事では、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を定期的に確認し、コードレビューでセキュリティチェックを習慣化することから始めましょう。