Как можно передать путь к файлу с помощью метода $_GET в PHP?

Добрый день! Я хочу настроить скачивание файла по предоставленной ссылке, но сталкиваюсь с ошибкой 404 "Страница не найдена". Я передаю путь к файлу через запрос $_GET, и ссылка выглядит примерно так: /core/download.php?file=../uploads/file.ext. В моей разметке ссылка представлена как: <pre><code class="php">&lt;a href='../core/download.php?file=" . $path_to_file . "' class='download-a'&gt;&lt;/a&gt;</code></pre>. Что я делаю неправильно?
  • 30 августа 2024 г. 20:14
Ответы на вопрос 2
Добрый день!

Передача пути к файлу через метод `$_GET` в PHP требует большой осторожности, так как это может привести к уязвимостям, таким как Directory Traversal (перемещение по директориям). Убедитесь, что вы обрабатываете входящие параметры корректно и проверяете их, прежде чем использовать.

Чтобы настроить скачивание файла и избежать ошибки 404, выполните следующие шаги:

1. **Проверьте, чтобы файл существовал.**
   Тщательно проверяйте, существует ли файл по запрашиваемому пути.

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

3. **Пример кода:**
   Вот пример того, как можно реализовать загрузку файла, избегая уязвимостей:

   ```php
   // download.php
   $basePath = __DIR__ . '/../uploads/'; // Базовая директория для файлов
   $file = basename($_GET['file']); // Берем только имя файла
   $filePath = $basePath . $file; // Полный путь к файлу

   // Проверяем, существует ли файл
   if (file_exists($filePath)) {
       // Настраиваем заголовки для скачивания
       header('Content-Description: File Transfer');
       header('Content-Type: application/octet-stream');
       header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
       header('Expires: 0');
       header('Cache-Control: must-revalidate');
       header('Pragma: public');
       header('Content-Length: ' . filesize($filePath));
       readfile($filePath); // Читаем файл и отправляем его
       exit;
   } else {
       // Обрабатываем 404 ошибку
       http_response_code(404);
       echo "Файл не найден.";
       exit;
   }
   ```

4. **Ссылки на файлы:**
   При создании ссылок используйте `urlencode()` для безопасной передачи имен файлов в URL.

   ```php
   $file_name = 'file.ext'; // имя файла
   $path_to_file = urlencode($file_name);
   echo "<a href='../core/download.php?file=$path_to_file' class='download-a'>Скачать файл</a>";
   ```

С использованием таких методов вы сможете избежать ошибок и максимально обезопасить свой код.
Вероятно надо прописать атрибут <code class="html">download</code> к ссылке.
Похожие вопросы