mirror of
https://github.com/django/django.git
synced 2025-09-26 12:09:19 +00:00
Fixed CVE-2021-28658 -- Fixed potential directory-traversal via uploaded files.
Thanks Claude Paroz for the initial patch. Thanks Dennis Brinkrolf for the report.
This commit is contained in:
parent
78fea27f69
commit
d4d800ca1a
9 changed files with 159 additions and 23 deletions
|
@ -1,6 +1,8 @@
|
|||
"""
|
||||
Upload handlers to test the upload API.
|
||||
"""
|
||||
import os
|
||||
from tempfile import NamedTemporaryFile
|
||||
|
||||
from django.core.files.uploadhandler import (
|
||||
FileUploadHandler, StopUpload, TemporaryFileUploadHandler,
|
||||
|
@ -43,3 +45,32 @@ class ErroringUploadHandler(FileUploadHandler):
|
|||
"""A handler that raises an exception."""
|
||||
def receive_data_chunk(self, raw_data, start):
|
||||
raise CustomUploadError("Oops!")
|
||||
|
||||
|
||||
class TraversalUploadHandler(FileUploadHandler):
|
||||
"""A handler with potential directory-traversal vulnerability."""
|
||||
def __init__(self, request=None):
|
||||
from .views import UPLOAD_TO
|
||||
|
||||
super().__init__(request)
|
||||
self.upload_dir = UPLOAD_TO
|
||||
|
||||
def file_complete(self, file_size):
|
||||
self.file.seek(0)
|
||||
self.file.size = file_size
|
||||
with open(os.path.join(self.upload_dir, self.file_name), 'wb') as fp:
|
||||
fp.write(self.file.read())
|
||||
return self.file
|
||||
|
||||
def new_file(
|
||||
self, field_name, file_name, content_type, content_length, charset=None,
|
||||
content_type_extra=None,
|
||||
):
|
||||
super().new_file(
|
||||
file_name, file_name, content_length, content_length, charset,
|
||||
content_type_extra,
|
||||
)
|
||||
self.file = NamedTemporaryFile(suffix='.upload', dir=self.upload_dir)
|
||||
|
||||
def receive_data_chunk(self, raw_data, start):
|
||||
self.file.write(raw_data)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue