77from django .urls import reverse
88from django .conf import settings
99from django .middleware .locale import LocaleMiddleware
10+ from django .http import HttpResponseNotFound
1011from django .utils import translation
12+ from django .shortcuts import render
13+
1114logger = logging .getLogger ('admin_logout_logger' )
15+ Honeypot_logger = logging .getLogger ("honeypot_logger" )
1216
1317class AutoLogoutMiddleware (MiddlewareMixin ):
1418 """
@@ -149,12 +153,42 @@ def process_request(self, request):
149153 request .LANGUAGE_CODE = translation .get_language ()
150154
151155
156+
152157class SecurityHeadersMiddleware :
153158 """
154159 Middleware to add security headers that help mitigate vulnerabilities
155160 in third-party JavaScript libraries and prevent common attacks.
156161 """
157162
163+
164+ # Honeypot Middleware
165+
166+ class HoneypotMiddleware :
167+ """
168+ Middleware to detect and log requests to honeypot (fake) paths.
169+ Normal users will never visit these paths.
170+ If triggered, log the attempt and return a 404 page.
171+ """
172+
173+ # Fake paths attackers often try
174+ HONEYPOT_PATHS = [
175+ "/admin-secret" ,
176+ "/Main-admin" ,
177+ "/superuser" ,
178+ "/dashboard-old" ,
179+ "/backup.sql" ,
180+ "/db.dump" ,
181+ "/config.php" ,
182+ "/env.bak" ,
183+ "/administration-login" ,
184+ "/auth-test" ,
185+ "/secure-login" ,
186+ "/test-page" ,
187+ "/debug/" ,
188+ "/old-site/"
189+ ]
190+
191+
158192 def __init__ (self , get_response ):
159193 self .get_response = get_response
160194
@@ -197,4 +231,31 @@ def __call__(self, request):
197231 'gyroscope=()'
198232 )
199233
200- return response
234+ return response
235+
236+ path = request .path
237+
238+ # Check if the request path is in honeypot traps
239+ if path in self .HONEYPOT_PATHS :
240+ ip = self .get_client_ip (request )
241+ ua = request .META .get ("HTTP_USER_AGENT" , "unknown" )
242+
243+ Honeypot_logger .warning (
244+ f"HONEYPOT TRIGGERED: Path={ path } , IP={ ip } , User-Agent={ ua } "
245+ )
246+
247+ # Return fake 404 so attacker doesn't know it’s a trap
248+ return render (request , "404.html" , status = 404 )
249+
250+ # Otherwise continue normally
251+ return self .get_response (request )
252+
253+ def get_client_ip (self , request ):
254+ """Extract client IP address from headers"""
255+ x_forwarded_for = request .META .get ("HTTP_X_FORWARDED_FOR" )
256+ if x_forwarded_for :
257+ ip = x_forwarded_for .split ("," )[0 ]
258+ else :
259+ ip = request .META .get ("REMOTE_ADDR" , "" )
260+ return ip
261+
0 commit comments