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, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.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のセキュリティ設定についても参照してください。