1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OWASP Top 10をWebアプリでどう防ぐか — 実装の対応表

1
Posted at

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 で承っています。

雪符しき / SNOW CODE — プログラム × 音楽 × カクテルを愛する雪猫エンジニア

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?