PHP PHP  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Файлы и загрузки

Тест заставляет различать имя, присланное браузером, временный файл и окончательный путь на сервере. Вопросы охватывают режимы открытия, блокировки, ошибки загрузки, проверку типа и защиту от подмены имени.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. Смотрите не только на успешный сценарий, но и на частичную запись, отказ и недоверенный путь. Время — 55 минут.
Вопрос 1 из 20
Что произойдёт при fopen($path, "w") для существующего файла?
PHP
$handle = fopen($path, 'w');
fwrite($handle, 'новые данные');
fclose($handle);
Вопрос 2 из 20
Как корректно проверить результат fopen?
PHP
$handle = fopen($path, 'rb');
if ($handle === false) {
    throw new RuntimeException("Не удалось открыть $path");
}
Вопрос 3 из 20
Зачем использовать flock при обновлении общего текстового счётчика?
PHP
$handle = fopen($counterFile, 'c+');
flock($handle, LOCK_EX);
$count = (int) stream_get_contents($handle);
ftruncate($handle, 0);
rewind($handle);
fwrite($handle, (string) ($count + 1));
flock($handle, LOCK_UN);
fclose($handle);
Вопрос 4 из 20
Что вернёт file_get_contents при ошибке чтения?
Вопрос 5 из 20
Какой режим fopen создаёт новый файл, но отказывается перезаписывать существующий?
Вопрос 6 из 20
Почему chmod 777 на каталог загрузок — плохое универсальное решение?
PHP
$uploadDir = '/srv/app/uploads';
chmod($uploadDir, 0777);
Вопрос 7 из 20
Для создания файла внутри каталога какие права обычно нужны процессу?
PHP
$path = '/srv/app/uploads/report.txt';
file_put_contents($path, $content);
Вопрос 8 из 20
Почему is_writable($path) не гарантирует, что последующая запись точно удастся?
PHP
if (is_writable($path)) {
    file_put_contents($path, $content);
}
Вопрос 9 из 20
Как узнать, от чьего имени PHP-FPM пишет файл?
Вопрос 10 из 20
Новый файл получает более строгие права, чем передано chmod-подобной операции создания. Что могло повлиять?
Вопрос 11 из 20
Какой код нужно проверить прежде всех MIME-проверок?
PHP
$file = $_FILES['file'] ?? null;
if (!is_array($file) || ($file['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK) {
    throw new RuntimeException('Загрузка не завершена');
}
Вопрос 12 из 20
Что означает UPLOAD_ERR_INI_SIZE?
PHP
if (($_FILES['file']['error'] ?? null) === UPLOAD_ERR_INI_SIZE) {
    throw new RuntimeException('Превышен upload_max_filesize');
}
Вопрос 13 из 20
Почему нельзя проверять только $_FILES[...]['size']?
Вопрос 14 из 20
Как убедиться, что путь относится к настоящей HTTP-загрузке?
Вопрос 15 из 20
Что означает UPLOAD_ERR_NO_FILE?
Вопрос 16 из 20
Почему basename($_FILES['file']['name']) недостаточно для безопасного хранения?
PHP
$name = basename($_FILES['file']['name']);
move_uploaded_file($_FILES['file']['tmp_name'], $storage . '/' . $name);
Вопрос 17 из 20
Как лучше определить тип изображения?
PHP
$tmp = $_FILES['image']['tmp_name'];
$mime = (new finfo(FILEINFO_MIME_TYPE))->file($tmp);
$imageInfo = getimagesize($tmp);
if ($mime !== 'image/png' || $imageInfo === false) {
    throw new RuntimeException('Недопустимое изображение');
}
Вопрос 18 из 20
Почему загрузки разумно хранить вне веб-корня?
Вопрос 19 из 20
Какой фрагмент содержит обход каталога?
Вопрос 20 из 20
Что нужно сделать при выдаче пользовательского файла с исходным именем в Content-Disposition?

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу