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

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

 

Разместить файл выше корня сайта, отдавать только через скрипт

 

Ну или на уровне сервера (nginx) например ограничить доступ к директории (или файлу) , к которой лежит файл.

 

На некоторых сайтах видел что то подобное на странице где стоит ссылка прописывается так

PHP:
  1. define(‘MY_CONSTANT’, TRUE);

на на странице загрузки
download.php?id=3

PHP:
  1. if (!defined(‘MY_CONSTANT’)) exit(‘No direct script access allowed.’);

но не совсем понимаю как это работает

 

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

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

 

Мне по сути нужно просто скрыть прямой путь что бы защититься от парсинга. Что бы на странице не отображались ссылки или пути к файлу.

 

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

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

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

 

вам же написали — отдавайте файл через скрипт, не пишите напрямую ссылки

принцип такой

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>
 

readfile
— Добавлено —
В реале все равно модули сервера должны контент файлов отдавать.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *