mirror of
https://github.com/pretix/pretix.git
synced 2026-05-07 15:34:02 +00:00
Prevent nullbytes in input data globally (#6071)
* Prevent nullbytes in input data globally * Only on urlencoded POST * Split middleware
This commit is contained in:
@@ -24,6 +24,7 @@ from urllib.parse import urlparse, urlsplit
|
||||
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import BadRequest
|
||||
from django.http import Http404, HttpRequest, HttpResponse
|
||||
from django.middleware.common import CommonMiddleware
|
||||
from django.urls import get_script_prefix, resolve
|
||||
@@ -347,6 +348,18 @@ class SecurityMiddleware(MiddlewareMixin):
|
||||
return resp
|
||||
|
||||
|
||||
class RejectInvalidInputMiddleware(MiddlewareMixin):
|
||||
|
||||
def process_request(self, request):
|
||||
# Nullbytes in GET/POST parameters are mostly harmless, as they will later fail on database insertion, but it
|
||||
# keeps spamming our error logs whenever someone tries to run a vulnerability scanner.
|
||||
if "\x00" in request.META['QUERY_STRING'] or "%00" in request.META['QUERY_STRING']:
|
||||
raise BadRequest("Invalid characters in input.")
|
||||
if request.method in ('POST', 'PUT', 'PATCH') and request.content_type == "application/x-www-form-urlencoded":
|
||||
if any("\x00" in value for key, value_list in request.POST.lists() for value in value_list):
|
||||
raise BadRequest("Invalid characters in input.")
|
||||
|
||||
|
||||
class CustomCommonMiddleware(CommonMiddleware):
|
||||
|
||||
def get_full_path_with_slash(self, request):
|
||||
|
||||
@@ -515,6 +515,7 @@ MIDDLEWARE = [
|
||||
'pretix.control.middleware.AuditLogMiddleware',
|
||||
'pretix.base.middleware.LocaleMiddleware',
|
||||
'pretix.base.middleware.SecurityMiddleware',
|
||||
'pretix.base.middleware.RejectInvalidInputMiddleware',
|
||||
'pretix.presale.middleware.EventMiddleware',
|
||||
'pretix.api.middleware.ApiScopeMiddleware',
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user