Source code for duck.http.middlewares.security.url
"""
Module containing middleware classes for inspecting urls for various attacks like XSS and SQL Injection.
"""
from duck.http.middlewares import BaseMiddleware
from duck.http.middlewares.security.modules.command_injection import (
check_command_injection_in_url,
)
from duck.http.middlewares.security.modules.sql_injection import (
check_sql_injection_in_url,
)
from duck.http.middlewares.security.modules.xss import check_xss_in_url
from duck.http.response import HttpBadRequestResponse
from duck.settings import SETTINGS
from duck.shortcuts import simple_response, template_response
from duck.utils.path import is_good_url_path
[docs]
class URLSecurityMiddleware(BaseMiddleware):
"""
URLSecurityMiddleware class checking URL correctness.
"""
debug_message: str = "URLSecurityMiddleware: Malformed URL"
[docs]
@classmethod
def get_error_response(cls, request):
if SETTINGS["DEBUG"]:
body = "<p>URL is Invalid or Malformed.</p>"
response = template_response(HttpBadRequestResponse, body=body)
else:
body = None
response = simple_response(HttpBadRequestResponse, body=body)
return response
[docs]
@classmethod
def process_request(cls, request):
url_path_ok = is_good_url_path(request.path)
if url_path_ok:
return cls.request_ok
return cls.request_bad
[docs]
class XSSMiddleware(BaseMiddleware):
"""
XSSMiddleware class mitigating against XSS attacks.
"""
debug_message: str = "XSSMiddleware: Potential url xss"
[docs]
@classmethod
def get_error_response(cls, request):
if SETTINGS["DEBUG"]:
body = "<p>URL contains Potential XSS Attack Signature.</p>"
if hasattr(request, "url_xss_attack"):
body = f"<p>{request.url_xss_attack}</p>"
response = template_response(HttpBadRequestResponse, body=body)
else:
body = None
response = simple_response(HttpBadRequestResponse, body=body)
return response
[docs]
@classmethod
def process_request(cls, request):
# check for xss in url
url = request.fullpath
xss_found, msg = check_xss_in_url(url)
if xss_found:
request.url_xss_attack = msg
return cls.request_bad
return cls.request_ok
[docs]
class SQLInjectionMiddleware(BaseMiddleware):
"""
SQLInjectionMiddleware class mitigating against SQL injection attacks.
"""
debug_message: str = "SQLInjectionMiddleware: Potential URL sql injection"
[docs]
@classmethod
def get_error_response(cls, request):
if SETTINGS["DEBUG"]:
body = "<p>URL contains Potential SQL Injection.</p>"
response = template_response(HttpBadRequestResponse, body=body)
else:
body = None
response = simple_response(HttpBadRequestResponse, body=body)
return response
[docs]
@classmethod
def process_request(cls, request):
# check for sql injection in url
url = request.fullpath
if not check_sql_injection_in_url(url):
return cls.request_ok
return cls.request_bad
[docs]
class CommandInjectionMiddleware(BaseMiddleware):
"""
CommandInjectionMiddleware class mitigating against command injection attacks.
"""
debug_message: str = (
"CommandInjectionMiddleware: Potential URL command injection")
[docs]
@classmethod
def get_error_response(cls, request):
if SETTINGS["DEBUG"]:
body = "<p>URL contains Potential Command Injection.</p>"
response = template_response(HttpBadRequestResponse, body=body)
else:
body = None
response = simple_response(HttpBadRequestResponse, body=body)
return response
[docs]
@classmethod
def process_request(cls, request):
# check for command injection in url
url = request.fullpath
if not check_command_injection_in_url(url.split(
"?", 1)[0]) and not check_command_injection_in_url(
url.replace("&", "")):
return cls.request_ok
return cls.request_bad