Webアプリケーションのセキュリティは、現代のエンジニアにとって必須のスキルです。2026年のサイバー攻撃はますます巧妙化しており、OWASP Top10で挙げられる脆弱性を理解し、適切な対策を実装できるエンジニアの価値は高まっています。本記事では、エンジニアが知っておくべきWebセキュリティの基礎から実践的な対策まで解説します。
OWASP Top 10(2025年版)でエンジニアが対応すべき脆弱性
| 順位 | 脆弱性 | 概要 | 影響度 |
|---|---|---|---|
| A01 | アクセス制御の不備 | 認可なしに機能やデータへアクセスできる | 極めて高い |
| A02 | 暗号化の失敗 | 機密データの不適切な暗号化・保護 | 極めて高い |
| A03 | インジェクション | SQLインジェクション・XSS・コマンドインジェクション | 高い |
| A04 | セキュアでない設計 | 設計段階でのセキュリティ考慮不足 | 高い |
| A05 | セキュリティの設定ミス | デフォルト設定・不要な機能の放置 | 高い |
| A07 | 認証・認可の不備 | パスワード管理・セッション管理の欠陥 | 高い |
| A08 | ソフトウェアとデータの整合性 | 未検証コードの実行・CIパイプラインの脆弱性 | 高い |
SQLインジェクション対策:プリペアドステートメントの実装
SQLインジェクションは最も古典的でありながら、今も多くのシステムで発見される脆弱性です。
import sqlite3
from typing import Optional
# 危険なコード(絶対にやってはいけない)
def get_user_unsafe(username: str) -> Optional[dict]:
conn = sqlite3.connect('users.db')
# SQLインジェクション脆弱性!
query = f"SELECT * FROM users WHERE username = '{username}'"
cursor = conn.execute(query)
return cursor.fetchone()
# 安全なコード(プリペアドステートメント)
def get_user_safe(username: str) -> Optional[dict]:
conn = sqlite3.connect('users.db')
# パラメータバインディングでSQLインジェクションを防止
query = "SELECT * FROM users WHERE username = ?"
cursor = conn.execute(query, (username,))
return cursor.fetchone()
# 攻撃例:username = "admin' OR '1'='1"
# 安全版では無効化される
XSS(クロスサイトスクリプティング)対策
XSSはユーザーの入力値をエスケープせずにHTMLに出力することで発生します。React・Vue.jsなどのモダンフレームワークは自動エスケープしますが、innerHTML等の危険なAPIを使う場合は注意が必要です。
// 危険:ユーザー入力をそのままHTMLに挿入
const dangerousComponent = (userInput: string) => {
document.getElementById('output')!.innerHTML = userInput;
// 攻撃例:userInput = ""
};
// 安全:テキストコンテンツとして設定
const safeComponent = (userInput: string) => {
document.getElementById('output')!.textContent = userInput;
};
// React(JSX)では通常はデフォルトで安全
const SafeReactComponent = ({ userInput }: { userInput: string }) => {
return <div>{userInput}</div>; // 自動エスケープ
};
// dangerouslySetInnerHTMLは使用を避ける
const DangerousReactComponent = ({ html }: { html: string }) => {
return <div dangerouslySetInnerHTML={{ __html: html }} />; // 危険!
};
認証・セッション管理のベストプラクティス
- パスワードハッシュ化:bcrypt・argon2を使用(MD5・SHA1は絶対NG)
- 多要素認証(MFA):TOTP(Google Authenticator)やWebAuthnの実装
- セッショントークン:暗号学的に安全な乱数生成(secrets.token_urlsafe等)
- JWT:適切なアルゴリズム(RS256推奨)・有効期限・秘密鍵管理
- HTTPS強制:HTTP Strict Transport Security(HSTS)ヘッダーの設定
セキュリティテスト:エンジニアが使うべき脆弱性診断ツール
| ツール | 種類 | 特徴 | ライセンス |
|---|---|---|---|
| OWASP ZAP | 動的テスト | Webアプリの脆弱性スキャン・プロキシ | 無料 |
| Burp Suite | 動的テスト | プロフェッショナル向けペネトレーションテスト | 無料〜有料 |
| Bandit | 静的解析 | Pythonコードのセキュリティ問題検出 | 無料 |
| Snyk | 依存関係スキャン | ライブラリの既知脆弱性チェック・CI統合 | 無料〜有料 |
| Semgrep | 静的解析 | 多言語対応・カスタムルール作成可能 | 無料〜有料 |
| Trivy | コンテナスキャン | DockerイメージのCVEスキャン | 無料 |
セキュリティ資格でキャリアアップ
セキュリティエンジニアとしてのキャリアを築くには、以下の資格が有効です:
- 情報処理安全確保支援士(登録セキスペ):国家資格・最重要
- CompTIA Security+:国際的に認知された基礎資格
- CEH(Certified Ethical Hacker):倫理的ハッキングの認定資格
- AWS Security Specialty:クラウドセキュリティ特化
- CISSP:セキュリティ分野の最高峰資格(5年以上の経験が必要)
セキュリティスキルを持つエンジニアは年収800万円〜1,500万円以上も珍しくなく、需要に対して人材が慢性的に不足しています。今からセキュリティの学習を始めることで、希少価値の高いエンジニアになることができます。