from django.core.exceptions import PermissionDenied from django.core.cache import cache from django.conf import settings class IPBlockingMiddleware: def __init__(self, get_response): self.get_response = get_response # 事前にブロックする IP アドレスのリスト self.blacklisted_ips = getattr(settings, 'BLACKLISTED_IPS', []) def __call__(self, request): ip = self.get_client_ip(request) # キャッシュからブロックリストを取得 blocked_ips = cache.get('blocked_ips', set()) # 事前にブロックされた IP またはキャッシュ内のブロックされた IP をチェック if ip in self.blacklisted_ips or ip in blocked_ips: raise PermissionDenied # 不正アクセスの検出ロジックをここに実装 if self.is_suspicious(ip): blocked_ips.add(ip) cache.set('blocked_ips', blocked_ips, timeout=3600) # 1時間ブロック raise PermissionDenied response = self.get_response(request) return response def is_suspicious(self, ip): request_count = cache.get(f'request_count_{ip}', 0) cache.set(f'request_count_{ip}', request_count + 1, timeout=60) return request_count > 100 # 1分間に100回以上のリクエストがあれば不審と判断 def get_client_ip(self, request): x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: ip = x_forwarded_for.split(',')[0] else: ip = request.META.get('REMOTE_ADDR') return ip