Еще один тест - команда file .Он проверяет наличие «магических чисел» в файле, чтобы определить его тип.В моей системе пакет file
включает libmagic
, а также оболочку на основе ctypes /usr/lib64/python2.7/site-packages/magic.py
.Похоже, вы используете его следующим образом:
import magic
ms = magic.open(magic.MAGIC_NONE)
ms.load()
type = ms.file("/path/to/some/file")
print type
f = file("/path/to/some/file", "r")
buffer = f.read(4096)
f.close()
type = ms.buffer(buffer)
print type
ms.close()
(код от здесь .)
Относительно вашего исходного вопроса: «Прочитайте источник, Люк. "
django / core / files / images.py:
"""
Utility functions for handling images.
Requires PIL, as you might imagine.
"""
from django.core.files import File
class ImageFile(File):
"""
A mixin for use alongside django.core.files.base.File, which provides
additional features for dealing with images.
"""
def _get_width(self):
return self._get_image_dimensions()[0]
width = property(_get_width)
def _get_height(self):
return self._get_image_dimensions()[1]
height = property(_get_height)
def _get_image_dimensions(self):
if not hasattr(self, '_dimensions_cache'):
close = self.closed
self.open()
self._dimensions_cache = get_image_dimensions(self, close=close)
return self._dimensions_cache
def get_image_dimensions(file_or_path, close=False):
"""
Returns the (width, height) of an image, given an open file or a path. Set
'close' to True to close the file at the end if it is initially in an open
state.
"""
# Try to import PIL in either of the two ways it can end up installed.
try:
from PIL import ImageFile as PILImageFile
except ImportError:
import ImageFile as PILImageFile
p = PILImageFile.Parser()
if hasattr(file_or_path, 'read'):
file = file_or_path
file_pos = file.tell()
file.seek(0)
else:
file = open(file_or_path, 'rb')
close = True
try:
while 1:
data = file.read(1024)
if not data:
break
p.feed(data)
if p.image:
return p.image.size
return None
finally:
if close:
file.close()
else:
file.seek(file_pos)
Похоже, он просто читает файл по 1024 байта за раз, пока PIL не скажет, что это изображение, а затем остановится,Очевидно, что это не проверка целостности всего файла, так что это действительно зависит от того, что вы подразумеваете под «покрытием моей безопасности загрузки изображений»: незаконные данные могут добавляться к изображению и передаваться через ваш сайт.Кто-то может сделать ваш сайт DOS, загрузив много мусора или действительно большой файл.Вы можете быть уязвимы для атаки с помощью инъекций, если вы не проверите какие-либо загруженные подписи или не сделаете предположения о загруженном имени файла изображения.И так далее.