Ok so I was looking through the code and I saw this (in
django/core/files/uploadhandler.py) :


FileUploadHandler
...

   def new_file(self, field_name, file_name, content_type,
content_length, charset=None):
       """
       Signal that a new file has been started.

       Warning: As with any data from the client, you should not trust
       content_length (and sometimes won't even get it).
       """

So the content_length we control right? - Maybe I missed something but
... I can say I want to upload a small file then upload a file that
triggers an oom condition / use a lot of memory no ? ...

And then this.

class MemoryFileUploadHandler(FileUploadHandler):
   """
   File upload handler to stream uploads into memory (used for small
files).
   """

   def handle_raw_input(self, input_data, META, content_length,
boundary, encoding=None):
       """
       Use the content_length to signal whether or not this handler
should be in use.
       """
       # Check the content-length header to see if we should
       # If the post is too large, we cannot use the Memory handler.
       if content_length > settings.FILE_UPLOAD_MAX_MEMORY_SIZE:
           self.activated = False
       else:
           self.activated = True

   def new_file(self, *args, **kwargs):
       super(MemoryFileUploadHandler, self).new_file(*args, **kwargs)
       if self.activated:
           self.file = StringIO()
           raise StopFutureHandlers()

   def receive_data_chunk(self, raw_data, start):
       """
       Add the data to the StringIO file.
       """
       if self.activated:
           self.file.write(raw_data)
       else:
           return raw_data

   def file_complete(self, file_size):
       """
       Return a file object if we're activated.
       """
       if not self.activated:
           return

       self.file.seek(0)
       return InMemoryUploadedFile(
           file = self.file,
           field_name = self.field_name,
           name = self.file_name,
           content_type = self.content_type,
           size = file_size,

There is a regression test for this  BUT --> in the test suite there
is # A small file (under the 5M quota)
which is governed by
(django/tests/regressiontests/file_uploads/uploadhandler.py)


def receive_data_chunk(self, raw_data, start):
       self.total_upload += len(raw_data)
       if self.total_upload >= self.QUOTA:
          raise StopUpload(connection_reset=True)
       return raw_data

So obviously my proposed attack is to simply say "content length is
tiny" and "this file is actually HUGE".
I hope I missed something :) I don't really want this to occur ...

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to