Webアプリケーションのセキュリティは、現代の開発者にとって避けられない重要課題です。2026年もサイバー攻撃は巧妙化しており、OWASP Top 10を基に基礎的な脆弱性対策を理解することが不可欠です。
OWASP Top 10とは?
OWASP(Open Web Application Security Project)は、Webアプリケーションセキュリティの国際的なコミュニティです。OWASP Top 10は、最も重要なWebアプリケーションのセキュリティリスクをまとめたリストで、セキュリティ対策の基準として世界中で活用されています。
A01: アクセス制御の不備(Broken Access Control)
最も一般的かつ深刻な脆弱性カテゴリです。ユーザーが本来アクセスできないリソースやデータにアクセスできてしまう問題です。
対策
- 最小権限の原則:ユーザーに必要最小限の権限のみ付与
- すべてのAPIエンドポイントで認証・認可チェックを実装
- JWTトークンの適切な検証と有効期限設定
- CORS設定の適切な管理
// Node.js/Express での認可ミドルウェア例
const authMiddleware = async (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) return res.status(401).json({ error: 'Unauthorized' });
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (error) {
return res.status(403).json({ error: 'Invalid token' });
}
};
// リソースオーナーのチェック
const checkOwnership = async (req, res, next) => {
const resource = await Resource.findById(req.params.id);
if (resource.userId !== req.user.id) {
return res.status(403).json({ error: 'Forbidden' });
}
next();
};
A03: インジェクション(Injection)
SQLインジェクション・コマンドインジェクション・XSSなど、悪意あるコードを注入する攻撃です。
// 悪い例(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]);
// XSS対策: HTMLエスケープ
const escapeHtml = (str) => {
return str
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
};
A02: 暗号化の失敗(Cryptographic Failures)
パスワードの平文保存・弱い暗号化アルゴリズムの使用・HTTPSの未設定など、機密データの保護が不十分な問題です。
// パスワードハッシュ化(bcryptを使用)
const bcrypt = require('bcrypt');
const SALT_ROUNDS = 12;
// パスワード保存時
const hashedPassword = await bcrypt.hash(plainPassword, SALT_ROUNDS);
// パスワード検証時
const isValid = await bcrypt.compare(plainPassword, hashedPassword);
// 機密データの環境変数管理
// .env ファイルに保存し、Gitに含めない
DATABASE_URL=postgresql://...
JWT_SECRET=your-256-bit-secret
ENCRYPTION_KEY=your-encryption-key
セキュリティヘッダーの設定
HTTPセキュリティヘッダーを適切に設定することで、多くの攻撃を防げます。
// Helmet.jsを使ったセキュリティヘッダー設定(Express)
const helmet = require('helmet');
app.use(helmet({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "'unsafe-inline'", 'cdn.example.com'],
styleSrc: ["'self'", "'unsafe-inline'"],
imgSrc: ["'self'", 'data:', 'cdn.example.com'],
},
},
hsts: {
maxAge: 31536000,
includeSubDomains: true,
preload: true
}
}));
依存関係の脆弱性チェック
使用しているnpmパッケージに既知の脆弱性が含まれていないか定期的に確認することが重要です。
# npmの脆弱性チェック
npm audit
npm audit fix
# Snykによる詳細な脆弱性スキャン
npx snyk test
npx snyk monitor
セキュリティテスト:自動化の実践
CI/CDパイプラインにセキュリティスキャンを組み込むことで、継続的なセキュリティ品質を維持できます。SAST(静的解析)・DAST(動的解析)・SCA(ソフトウェアコンポジション分析)を組み合わせた多層防御が理想的です。
まとめ:セキュリティはシフトレフトで
セキュリティは開発の後工程ではなく、設計・実装段階から意識することが重要です(シフトレフト)。OWASP Top 10を基本として、定期的なセキュリティレビュー・自動スキャン・ペネトレーションテストを組み合わせることで、堅牢なWebアプリケーションを構築できます。