Webセキュリティの重要性
2026年現在、Webアプリケーションへのサイバー攻撃は年々増加しています。OWASP(Open Web Application Security Project)が毎年発表するTop 10脆弱性を理解し、適切な対策を実装することはすべての開発者の責務です。
OWASP Top 10(2026年版)主要脆弱性と対策
1. Injection(インジェクション)
SQLインジェクション・OSコマンドインジェクションなど。ユーザー入力をそのままクエリに使用することで発生します。
// 危険なコード(SQLインジェクション脆弱性あり)
const query = `SELECT * FROM users WHERE email = '${email}'`;
// 安全なコード(プリペアドステートメント)
// Node.js + PostgreSQL (pg)
const result = await pool.query(
'SELECT * FROM users WHERE email = $1',
[email] // パラメータとして渡す
);
// Node.js + MySQL2
const [rows] = await db.execute(
'SELECT * FROM users WHERE email = ?',
[email]
);
// Prisma(ORMは基本的に安全)
const user = await prisma.user.findUnique({
where: { email: email }
});
2. XSS(クロスサイトスクリプティング)
// 危険:HTMLをそのまま埋め込む
document.getElementById('output').innerHTML = userInput;
// 安全:テキストとして表示
document.getElementById('output').textContent = userInput;
// React はデフォルトでエスケープ済み(dangerouslySetInnerHTMLは避ける)
const SafeComponent = ({ userContent }) => (
{userContent} // 安全:自動的にエスケープされる
);
// Content Security Policy (CSP) ヘッダーの設定
// Express.js + Helmet.js
import helmet from 'helmet';
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "'nonce-{RANDOM}'"],
styleSrc: ["'self'", "'unsafe-inline'"],
imgSrc: ["'self'", "data:", "https:"],
}
}));
3. 認証の欠陥(Broken Authentication)
// 安全なパスワードハッシュ(bcrypt)
import bcrypt from 'bcrypt';
// パスワードのハッシュ化(登録時)
const SALT_ROUNDS = 12; // 2026年推奨値
const hashedPassword = await bcrypt.hash(plainPassword, SALT_ROUNDS);
// パスワード検証(ログイン時)
const isValid = await bcrypt.compare(inputPassword, hashedPassword);
// JWT の安全な実装
import jwt from 'jsonwebtoken';
// トークン生成
const accessToken = jwt.sign(
{ userId: user.id, role: user.role },
process.env.JWT_SECRET!,
{ expiresIn: '15m' } // 短い有効期限
);
const refreshToken = jwt.sign(
{ userId: user.id },
process.env.REFRESH_TOKEN_SECRET!,
{ expiresIn: '7d' }
);
// リフレッシュトークンはDBに保存してローテーション管理
4. セキュアな通信(HTTPS設定)
# Nginx でのHTTPS設定(Let's Encrypt使用)
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 強力な暗号化設定
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
# HSTS(HTTPSを強制)
add_header Strict-Transport-Security "max-age=63072000" always;
# セキュリティヘッダー
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header Referrer-Policy strict-origin-when-cross-origin;
}
WAF(Web Application Firewall)の導入
WAFはアプリケーション層でHTTPトラフィックをフィルタリングし、SQLインジェクション・XSS・DDoSなどの攻撃をブロックします。
- AWS WAF:AWSサービスと統合。マネージドルールセットが豊富
- Cloudflare WAF:CDN機能付き。無料プランでも基本的なWAF機能あり
- XServer CloudSecure WP Security:WordPressに特化したシンプルWAF
依存関係の脆弱性管理
# npm auditで脆弱性チェック
npm audit
npm audit fix # 自動修正
# Snykで継続的なセキュリティ監視
snyk test # 現在の脆弱性チェック
snyk monitor # 継続監視
# GitHub Dependabotの設定(.github/dependabot.yml)
version: 2
updates:
- package-ecosystem: npm
directory: /
schedule:
interval: weekly
open-pull-requests-limit: 10
まとめ
Webセキュリティは「後から追加する」ものではなく、設計段階から組み込む「セキュリティ・バイ・デザイン」の考え方が重要です。特にインジェクション・XSS・認証の3大脆弱性を正しく理解し、プリペアドステートメント・CSP・JWT管理を適切に実装することで、大部分の攻撃を防ぐことができます。