Разрешить доступ к файлам в каталоге только с веб-сайта, частью которого они являются - PullRequest
1 голос
/ 05 марта 2020

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

У меня есть папка на root моего веб-сайта, содержащего загруженные файлы, которые можно просматривать и загружать с сайта при входе пользователя. Они находятся здесь: https://example.com/uploads (например). Мне нужно, чтобы сайт продолжал иметь возможность доступа к ним, чтобы отображать их (некоторые из них являются изображениями) и предоставлять ссылки для загрузки (pdfs et c), чтобы пользователь мог их скачать, но я хочу избегать тех, кто завладевает ими. URL конкретного файла, который может загружать их напрямую, например: https://example.com/uploads/2020/02/myfile.pdf. ИЛИ эти URL-адреса попадают в поисковые системы (или, если они это делают, сервер запрещает прямой доступ к ним.

Я попытался добавить файл .htaccess в каталог загрузки со следующим содержимым:

Order Deny,Allow
Deny from all
Allow from 127.0.0.1

И я попробовал

Order Allow,Deny
Deny from all
Allow from 127.0.0.1

... как я читал, что может разрешить HTTPS-звонки как с самого сайта, так и с локальных URL.

Но это запрещает сайт и прямой URL-запрос, который не годится.

Есть ли способ сделать это?

1 Ответ

1 голос
/ 05 марта 2020

Пользовательский интерфейс, который обеспечивает «официальный» доступ к файлам, имеет аутентификацию пользователя, да, но файлы все еще существуют в каталоге, что не остановит доступ к ним, если они знают URL.

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

Итак, это будет в первую очередь упражнение на любом языке сценариев / CMS, используемом для аутентификации «пользовательского интерфейса».

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

Например:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^uploads/. /serve-protected-file.php [L]

Любой запрос для /uploads/<something> (например, /uploads/2020/02/myfile.pdf), который сопоставляется с действительным файлом, направляется в ваш сценарий: /serve-protected-file.php.

/serve-protected-file.php тогда потребуется сделать что-то вроде следующего:

// 1. Parse the file being requested from REQUEST_URI

// 2. Is the requested file "protected"?
//    (Serving both protected and public files from the same directory?)

// 3. If not protected then serve/stream the resource to the client. END

// 4. If protected then authenticate the user...

// 5. If user authenticated then serve/stream the resource to the client. END

// 6. Resource is protected and user not authenticated...
//    Serve a 403 Forbidden. END

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...