За последние 24 часа нас посетили 22618 программистов и 1016 роботов. Сейчас ищут 613 программистов ...

Как ограничить доступ к файлу для загрузки?

Тема в разделе "PHP для новичков", создана пользователем AnteFil, 27 апр 2022.

  1. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Добрый день! Есть файл pesnya.mp3 и есть ссылка на загрузку
    ../mp3/pesnya.mp3
    При клике на ссылку файл успешно скачивается. Также если к файлу обратиться на прямую
    https://saite.ru/mp3/pesnya.mp3
    Он также успешно скачивается.
    Вопрос как запретить данное действие. Что бы скачать напрямую было не возможно, только с сопутствующей страницы или с новой страницы например download.php
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    Разместить файл выше корня сайта, отдавать только через скрипт
     
  3. Faab

    Faab Активный пользователь

    С нами с:
    17 янв 2009
    Сообщения:
    11
    Симпатии:
    0
    Ну или на уровне сервера (nginx) например ограничить доступ к директории (или файлу) , к которой лежит файл.
     
  4. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    На некоторых сайтах видел что то подобное на странице где стоит ссылка прописывается так
    PHP:
    1. define('MY_CONSTANT', TRUE);
    на на странице загрузки
    download.php?id=3
    PHP:
    1. if (!defined('MY_CONSTANT')) exit('No direct script access allowed.');
    но не совсем понимаю как это работает
     
  5. Faab

    Faab Активный пользователь

    С нами с:
    17 янв 2009
    Сообщения:
    11
    Симпатии:
    0
    Я могу ошибатся, но что прописано в скрипте, никак не решает проблему описанную Вами в топике темы. Если вы разместили в директории сайта какой нибудь файл, он доступен для всех настолько, насколько это позволяют настройки сервера для этого сайта.

    Если перейти на прямую урлу этого файла, и нет никаких настроек сервера, ограничвающих хоть как-то досутп к этому файлу, то НЕ вызывается никакой скрипт. Поэтому Вам и посоветовали, если есть возможность, переместить файл из директории сайта. Или же ограничить к нему прямой доступ из-вне путём настроек сервера для этого сайта.
     
  6. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Мне по сути нужно просто скрыть прямой путь что бы защититься от парсинга. Что бы на странице не отображались ссылки или пути к файлу.
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Это не для этого. Защита от прямого запуска скриптов там, где даже не предусмотрена возможность убрать скрипты из корня.

    По реальному ограничению ADSoft ответил.

    В таком случае достаточно «короткие ссылки» прикрутить.
    --- Добавлено ---
    P.S. Парсеры могут резолвить серверный редирект. Наверное, JS-редирект нужно прикрутить.
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    вам же написали - отдавайте файл через скрипт, не пишите напрямую ссылки

    принцип такой
    PHP:
    1. // download.php
    2. $links = [
    3. '1' => '/images/image1.jpg',
    4. '2' => '/images/image123.jpg',
    5. ];
    6. if (isset($_GET['link']) && isset($links[$_GET['link']]) {
    7.         header('Content-Disposition: attachment;filename="' . $links[$_GET['link']].'"');
    8.         header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
    9.         header('Cache-Control: cache, must-revalidate');
    10.         header('Pragma: public');
    11.        echo file_get_content($links[$_GET['link']]);
    12. }
    в html вызывает как
    HTML:
    1. <a href="download.php?link=2">download</a>
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    readfile
    --- Добавлено ---
    В реале все равно модули сервера должны контент файлов отдавать.