@tajfun_rt

Как запретить скачивание файл по прямой ссылке?

Как сделать так, чтобы файлы которые хранится в определенной папке могли скачать только три авторизированных модератора? Назовем их user1, user2 и user3. В папке хранятся текстовые файлы (.txt) и пополняется другими пользователями новыми файлами. С помощью данного когда я вывожу в виде таблице все файлы и эту таблицу видят только эти три модератора.

$url = '/upload';
    $dir = $_SERVER['DOCUMENT_ROOT'] . '/upload/'; 
    $moder=$_SESSION['login'];
    if ( $moder =='user1'|| $moder =='user2'|| $moder =='user3') { 
        echo "<table class='table table-hover'><thead>";
        echo "<tr><th scope='col'>№</th>
              <th scope='col'>Имя файла</th>
              <th scope='col'>Скачать</th>
              <th scope='col'>Примечание</th>
              </thead></tr>";
        foreach (glob($dir . '/*.txt') as $fileName) {
            $fileinfo = basename($fileName);
            $name_file= pathinfo($fileinfo, PATHINFO_FILENAME);
            echo "<tbody><tr>";
            echo '<td>'.$name_file.'</td>';
            echo '<td><a href="'. $url . '/'. basename($fileName) .'" download="'.$fileinfo.'">'.$name_file.'</a></td>';
            echo "<td>0</td>";
            echo "</tr></tbody>";
        }
        echo "</table>";  
    }

Это работает и файл скачивается, но зная ссылку можно скачать файл и без авторизации.
Я в папке с файлами создал файл .htaccess и в нем прописал Deny from all. Это конечно закрыло папку от скачивания не только для авторизированных , а вообще для всех.
Как сделать, чтобы эти три модератора смогли скачать?
  • Вопрос задан
  • 304 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Nolan81
программист
Надо файлы хранить в папке недоступной из веб.
При этом для какого то контроллера создать экшен, по отдачи этих файлов, где можно установить проверки, по правам.
И ссылки на картинки уже на этот экшен формировать
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Папка выше документ рута + readfile() + 2 заголовка. Ну и банальная проверка на роль.
Ответ написан
@Kypidon4ik
Фрилансер, Wordpress developer
1) Установите и активируйте плагин, который позволит вам управлять доступом к файлам. Например, "Members" или "User Role Editor".
2) Настройте прав доступа: Создайте пользовательскую роль, например, "модератор" и далее для доступа к этому файлу проверяйте есть ли роль "модератор у этого пользователя"
Ответ написан
@rPman
Я помню реализовывал очень простой механизм разграничения доступа к статическим файлам без привязки к особенностям веб серверов (там есть плагины на авторизацию) и при этом чтобы файлы для веб сервера оставались статикой.

Файлы размещаются в каталоге, недоступном веб серверу а в конфиге веб сервера включается поддержка симлинков (например apache - Options FollowSymLinks). Затем, модуль авторизации создает на каталог с файлами, к которым нужен доступ для пользователя символическую ссылку в публично доступном каталоге, с именем, равным идентификатору сессии пользователя session_id() а по завершению сеанса, симлинк удаляется (если сеанс должен завершаться автоматически, придется использовать какой то работающий демон или периодический по крону для проверки всех сессий на завершение). Таким образом ссылка на скачивание будет формироваться из сессии пользователя и будет оставаться статичной (т.е. веб сервер будет отдавать этот файл сам, максимально эффективно), но доступ к ней будет только у авторизованного.

Код для этого дела - несколько строчек.

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
14 июл. 2024, в 22:10
1000 руб./за проект
14 июл. 2024, в 20:18
20000 руб./за проект
14 июл. 2024, в 20:15
10000 руб./за проект