mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #19866 -- Added security logger and return 400 for SuspiciousOperation.
SuspiciousOperations have been differentiated into subclasses, and are now logged to a 'django.security.*' logger. SuspiciousOperations that reach django.core.handlers.base.BaseHandler will now return a 400 instead of a 500. Thanks to tiwoc for the report, and Carl Meyer and Donald Stufft for review.
This commit is contained in:
		| @@ -11,7 +11,7 @@ import cgi | ||||
| import sys | ||||
|  | ||||
| from django.conf import settings | ||||
| from django.core.exceptions import SuspiciousOperation | ||||
| from django.core.exceptions import SuspiciousMultipartForm | ||||
| from django.utils.datastructures import MultiValueDict | ||||
| from django.utils.encoding import force_text | ||||
| from django.utils import six | ||||
| @@ -370,7 +370,7 @@ class LazyStream(six.Iterator): | ||||
|                             if current_number == num_bytes]) | ||||
|  | ||||
|         if number_equal > 40: | ||||
|             raise SuspiciousOperation( | ||||
|             raise SuspiciousMultipartForm( | ||||
|                 "The multipart parser got stuck, which shouldn't happen with" | ||||
|                 " normal uploaded files. Check for malicious upload activity;" | ||||
|                 " if there is none, report this to the Django developers." | ||||
|   | ||||
| @@ -14,7 +14,7 @@ except ImportError: | ||||
|  | ||||
| from django.conf import settings | ||||
| from django.core import signing | ||||
| from django.core.exceptions import SuspiciousOperation, ImproperlyConfigured | ||||
| from django.core.exceptions import DisallowedHost, ImproperlyConfigured | ||||
| from django.core.files import uploadhandler | ||||
| from django.http.multipartparser import MultiPartParser | ||||
| from django.utils import six | ||||
| @@ -72,7 +72,7 @@ class HttpRequest(object): | ||||
|             msg = "Invalid HTTP_HOST header: %r." % host | ||||
|             if domain: | ||||
|                 msg += "You may need to add %r to ALLOWED_HOSTS." % domain | ||||
|             raise SuspiciousOperation(msg) | ||||
|             raise DisallowedHost(msg) | ||||
|  | ||||
|     def get_full_path(self): | ||||
|         # RFC 3986 requires query string arguments to be in the ASCII range. | ||||
|   | ||||
| @@ -12,7 +12,7 @@ except ImportError: | ||||
| from django.conf import settings | ||||
| from django.core import signals | ||||
| from django.core import signing | ||||
| from django.core.exceptions import SuspiciousOperation | ||||
| from django.core.exceptions import DisallowedRedirect | ||||
| from django.http.cookie import SimpleCookie | ||||
| from django.utils import six, timezone | ||||
| from django.utils.encoding import force_bytes, iri_to_uri | ||||
| @@ -452,7 +452,7 @@ class HttpResponseRedirectBase(HttpResponse): | ||||
|     def __init__(self, redirect_to, *args, **kwargs): | ||||
|         parsed = urlparse(redirect_to) | ||||
|         if parsed.scheme and parsed.scheme not in self.allowed_schemes: | ||||
|             raise SuspiciousOperation("Unsafe redirect to URL with protocol '%s'" % parsed.scheme) | ||||
|             raise DisallowedRedirect("Unsafe redirect to URL with protocol '%s'" % parsed.scheme) | ||||
|         super(HttpResponseRedirectBase, self).__init__(*args, **kwargs) | ||||
|         self['Location'] = iri_to_uri(redirect_to) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user