Завантаження файлів - одна з найчастіших дір: файл може виявитися скриптом, перезаписати чужий файл чи покласти сервер розміром.
Валідація:
$request->validate([
'avatar' => ['required', File::image()->max('2mb')->dimensions(Rule::dimensions()->maxWidth(4000))],
'contract' => ['required', 'file', 'mimes:pdf', 'max:10240'],
]);
mimesвизначає тип за вмістом, а не за назвою;extensionsперевіряє розширення, яке дав користувач - корисно разом зmimes;max- у кілобайтах; ліміт розміру тіла запиту ще й на вебсервері.
Збереження:
- ім'я -
hashName()(випадкове) і розширення -extension()(за вмістом).getClientOriginalName()можна підробити, зокрема з../у шляху; - приватні документи - на приватний диск, віддавати через контролер з перевіркою прав чи
temporaryUrl(); - публічний диск ніколи не має виконувати PHP: файли віддає вебсервер як статику.
Обробка:
- зображення перекодувати (Laravel 13:
$request->image('avatar')->toWebp()) - нове кодування зазвичай відкидає вбудований у файл сторонній вміст і метадані на кшталт геолокації (результат варто перевірити для свого драйвера); - великі файли обробляти в черзі.
Оригінальне ім'я файлу, якщо воно потрібне людям, зберігають окремо в базі й екранують при виводі.