CSRF攻撃の原因は、セッション管理に関する脆弱性です。攻撃者は、被害者が認証済みのセッションを持っている場合に、そのセッションを利用して攻撃を行います。具体的な攻撃手順は以下の通りです。
- 攻撃者は、被害者に認証済みのウェブアプリケーションにアクセスさせます。
- 被害者のブラウザは、認証済みのセッションクッキーを含んだリクエストを送信します。
- 攻撃者は、被害者のブラウザが送信するリクエストを操作し、攻撃者が意図したアクションを実行するようにします。
CSRF攻撃からアプリケーションを保護するためには、以下の対策が有効です。
- 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)
- SameSite属性の設定: クッキーのSameSite属性をStrictまたはLaxに設定することで、クロスサイトリクエストを制限することができます。
response.set_cookie('session_id', value=session_id, secure=True, httponly=True, samesite='Strict')
以上がCSRF攻撃の原因と対策方法の一例です。ウェブアプリケーションのセキュリティを向上させるためには、定期的な脆弱性評価やセキュリティ対策の導入が重要です。