Webアプリのセキュリティの共通言語が OWASP Top 10 です。名前だけ知っていても守れないので、代表的な項目を 実装レベルでどう防ぐか の対応表として整理します。
OWASP Top 10 とは
Webアプリで最も重大とされる10種のリスクをまとめたもので、業界標準の指針として使われます。全部を一度にではなく、影響の大きいものから潰します。
アクセス制御の不備(Broken Access Control)
最も多い問題です。「ログインしていれば誰でも他人のデータを見られる」といった認可の抜けが典型です。
# NG: 所有者チェックがない
def order_detail(request, order_id):
order = Order.objects.get(id=order_id)
# OK: 本人のものだけ
def order_detail(request, order_id):
order = get_object_or_404(Order, id=order_id, user=request.user)
認証(誰か)と認可(何をしてよいか)を分けて 考えるのが要点です。
インジェクション(SQL / コマンド)
ユーザー入力を文字列連結でクエリに混ぜると起きます。ORMやパラメータバインドを使えば大半は防げます。
# NG: 文字列連結
cursor.execute(f"SELECT * FROM users WHERE name = '{name}'")
# OK: パラメータバインド
cursor.execute("SELECT * FROM users WHERE name = %s", [name])
認証の不備(Identification and Authentication Failures)
弱いパスワード・総当たりへの無防備が該当します。フレームワークの認証を使い、ログイン試行に制限をかけます。
# ログイン試行回数の制限(擬似)
if failed_attempts(ip) > 5:
raise TooManyAttempts()
設定ミス(Security Misconfiguration)
DEBUG=True のまま公開、初期パスワード放置、不要な管理画面の露出などです。
DEBUG = False
ALLOWED_HOSTS = ["example.com"]
脆弱で古い依存(Vulnerable Components)
使っているライブラリの既知の脆弱性です。依存の棚卸しを定期化します。
pip-audit # 既知の脆弱性をスキャン
対応表(抜粋)
| リスク | 主な対策 |
|---|---|
| アクセス制御不備 | 所有者チェック・認可の明示 |
| インジェクション | ORM・パラメータバインド |
| 認証不備 | フレームワーク認証・試行制限 |
| 設定ミス | DEBUG無効・不要機能の停止 |
| 古い依存 | 定期スキャンと更新 |
まとめ
OWASP Top 10 は「知る」だけでなく 実装に落とす ことで初めて守りになります。まずアクセス制御・インジェクション・設定ミスの3つから潰すと、被害の大半を占める領域をカバーできます。
相談・お仕事のご依頼
こうした設計・実装・診断の実務は snowcode.jp で承っています。
- お仕事のご依頼・料金目安: snowcode.jp/work
- 技術ブログ: snowcode.jp/blog
- X: @SNOWCODE_JP
雪符しき / SNOW CODE — プログラム × 音楽 × カクテルを愛する雪猫エンジニア