Введение
В какой-то момент может потребоваться отображение файла, загруженного с фронт-офиса, в бэк-офисе. Это представляет собой угрозу безопасности, так как такие файлы могут содержать вредоносные скрипты, которые могут быть выполнены при прямой обработке Apache без надлежащего типа содержимого. Связанная уязвимость была обнаружена на мигрированной странице потока клиентов в бэк-офисе, где администратор может читать сообщения и файлы, отправленные с фронт-офиса.
Патч, введённый в версии 8.1.6, включает новый маршрут и связанный контроллер, позволяющий безопасно читать файлы, загруженные ненадёжными пользователями (такими как пользователи фронт-офиса). Хорошая новость заключается в том, что вы также можете использовать этот маршрут для обеспечения безопасности чтения файлов в бэк-офисе.
{{% notice info %}}
PrestaShop 8.1.6 ввёл изменение обратной совместимости: файлы, загруженные в папку upload
, больше не могут быть обработаны напрямую Apache, вам потребуется использовать маршрут admin_common_secured_file_image_reader
, как указано ниже, или реализовать свой собственный механизм чтения файлов.
{{% /notice %}}
Как использовать
В вашем шаблоне, вместо прямого вызова файла, например, изображения:
<a href="{{ message.attachmentFile }}" target="_blank">
Теперь вы можете использовать доступный маршрут для безопасного чтения файлов, которым нельзя доверять:
<a href="{{ path('admin_common_secured_file_image_reader', { 'fileName': message.attachmentFile }) }}" target="_blank">
Как это работает
Маршрут admin_common_secured_file_image_reader
связан с контроллером под названием SecuredFileReaderController
. Если файл предполагается как изображение, этот контроллер вернёт его с правильным HTTP заголовком типа содержимого, обеспечивая, что браузер не выполнит никакой скрипт, который он может содержать.
Для других типов документов, таких как PDF, документы Word, ZIP-файлы и т.д., файл будет загружен как вложение, предотвращая его открытие в контексте бэк-офиса.
Этот контроллер, SecuredFileReaderController
, определён как служба в src/PrestaShopBundle/Resources/config/services/bundle/controller.yml
. Это означает, что он может быть декорирован, позволяя вам управлять типами файлов, расширения которых не указаны в контроллере.