Django и SuspiciousFileOperation:Обнаружена попытка обхода пути
Я попадаю в странную ситуацию только при развертывании (debug == false
):
Моя модель выбрасывает исключение path traversal attempt
. Я хочу создать каталог для каждого загруженного файла и сохранить файл в каталоге (some.zip
), используемом в примере. В моей среде dev у меня нет проблем и все работает просто отлично.
models.py:
class Template(models.Model):
def get_folder(self, filename):
filename_PATH = Path(filename)
template_dir = filename_PATH.stem
return Path(settings.TEMPLATES_FOLDER).joinpath(template_dir, filename)
name = models.CharField("template", max_length=32, unique=True)
file = models.FileField("templatefile", upload_to=get_folder, null=True, max_length=260, storage=OverwriteStorage())
class OverwriteStorage(FileSystemStorage): #this is actually above
def get_available_name(self, name, max_length=None):
self.delete(name)
return name
forms.py:
class TemplateAdminForm(forms.ModelForm):
def __init__(self,*args,**kwargs):
super().__init__(*args, **kwargs)
class Meta:
model = Template
fields = ["name", "file", ]
def clean(self):
cleaned_data = super().clean()
upFile = Path(str(cleaned_data["file"]))
if upFile.suffix == ".zip":
path = self.instance.get_folder(cleaned_data["name"])
logging.error(f"{path}")
unpack_zip(path) ## works! the directory is created/filled
else:
raise forms.ValidationError("unknown file type ...")
logging.error("DONE!") # I see this output
return cleaned_data
## signal to see when the error might be happening:
@receiver(post_save, sender = Template)
def testing(sender, **kwargs):
logging.error("we never get here")
settings.py:
TEMPLATES_FOLDER = PATH(MEDIA_ROOT).joinpath("TEMPLATES")
but:
ERROR:django.security.SuspiciousFileOperation:Detected path traversal attempt in '/opt/project/media_root/TEMPLATES/some/some' WARNING:django.request:Bad Request: /admin/appName/template/add/
Я получаю ту же ошибку на Django 3.2.6 при открытии файла с режимом "wb" по абсолютному имени пути, я не использую временный файл, который, как я прочитал, рекомендуется для того, чтобы избежать этой проблемы, поэтому я ссылаюсь на этот ответ в случае, если он поможет вам развернуть его.
Вот где это советуют: ответ
Статья на эту тему: ссылка