Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Як безпечно приймати файли від користувачів?

Завантаження файлів - одна з найчастіших дір: файл може виявитися скриптом, перезаписати чужий файл чи покласти сервер розміром.

Валідація:

$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()) - нове кодування зазвичай відкидає вбудований у файл сторонній вміст і метадані на кшталт геолокації (результат варто перевірити для свого драйвера);
  • великі файли обробляти в черзі.

Оригінальне ім'я файлу, якщо воно потрібне людям, зберігають окремо в базі й екранують при виводі.

Докладніше в документації: Інформація про завантажений файл

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання