Для системы передачи файлов я храню данные на своем сервере. Доступ к данным можно получить с помощью URL, например:
http://filestorage.example.com/files/clientfiles/clientid/test.pdf
Все файлы в папке clientid / связаны на сгенерированной странице загрузки для клиента, например:
http://example.com/download.php?clientid=28692692846
Выше URL содержит веб-страницу с несколькими ссылками на все файлы в папке clientid:
<a href="http://filestorage.example.com/files/clientfiles/clientid/test.pdf" download>
test.pdf
</a>
...
Теперь я хочу ограничить доступ к файлам. Должен быть невозможен доступ к файлам извне, они должны быть доступны только из download.php.
Возможно ли вообще добиться чего-то подобного?
Файлы и скрипт находятся на одном сервере.
Вы можете положить .htaccess
файл в этой папке, который содержит только:
deny from all
Таким образом, вы не можете открыть какой-либо файл из этой папки, но вы можете включить их в php без проблем.
Самый простой способ, которым я могу придумать для достижения этой цели, — это использовать уникальную переменную сеанса, сгенерированную для файлов в папке / clientid — независимо от того, для чего они предназначены, это были бы простые страницы PHP, которые загружали файлы через download.php.
session_start();
$_SESSION['file_id'] = $secret_file_id;
header("Location: http://example.com/download.php?clientid=28692692846");
Затем в файле download.php проверьте эту переменную.
session_start();
if((isset($_SESSION['file_id'])) && ($_SESSION['file_id'] == $secret_file_id)) {
// Offer file for download
} else {
//Not referred from correct URL, reject.
}
Да, вы можете достичь этого через .htaccess
с помощью:
order deny,allow
deny from all
allow from example.com/download.php
Это запретит всем доступ, если они не посещают через example.com/download.php
,
Если вы используете Apache 2.4, вам нужно будет использовать:
Require all denied
Require host example.com/download.php
Очевидно, вам нужно будет разместить .htaccess
файл в папку, к которой вы хотите ограничить доступ тоже. Так что, если я правильно понимаю вашу файловую структуру, это будет /clientid/