CSRF攻撃の原因と対策方法 - コード例と共に解説


CSRF攻撃の原因は、セッション管理に関する脆弱性です。攻撃者は、被害者が認証済みのセッションを持っている場合に、そのセッションを利用して攻撃を行います。具体的な攻撃手順は以下の通りです。

  1. 攻撃者は、被害者に認証済みのウェブアプリケーションにアクセスさせます。
  2. 被害者のブラウザは、認証済みのセッションクッキーを含んだリクエストを送信します。
  3. 攻撃者は、被害者のブラウザが送信するリクエストを操作し、攻撃者が意図したアクションを実行するようにします。

CSRF攻撃からアプリケーションを保護するためには、以下の対策が有効です。

  1. CSRFトークンの使用: サーバーは、各リクエストに対してランダムなトークンを生成し、それをリクエストパラメータやヘッダに含めます。ブラウザは、トークンを自動的に送信するように設定されます。攻撃者は、トークンを知らない限り、正当なリクエストを作成することはできません。

以下は、Python/Flaskフレームワークを使用したCSRFトークンの実装例です。

from flask import Flask, request, session
import secrets
app = Flask(__name__)
app.secret_key = secrets.token_hex(16)
@app.route('/example', methods=['POST'])
def example():
    if 'csrf_token' not in session or request.form.get('csrf_token') != session['csrf_token']:
        return 'CSRF Token Validation Failed', 403
    # ここに正当なリクエストの処理を書く
@app.before_request
def csrf_protect():
    if request.method == 'POST':
        token = session.pop('csrf_token', None)
        if not token or token != request.form.get('csrf_token'):
            abort(403)
    else:
        session['csrf_token'] = secrets.token_hex(16)
  1. SameSite属性の設定: クッキーのSameSite属性をStrictまたはLaxに設定することで、クロスサイトリクエストを制限することができます。
response.set_cookie('session_id', value=session_id, secure=True, httponly=True, samesite='Strict')

以上がCSRF攻撃の原因と対策方法の一例です。ウェブアプリケーションのセキュリティを向上させるためには、定期的な脆弱性評価やセキュリティ対策の導入が重要です。