Поскольку вы не можете разместить файлы нигде, кроме как в каталоге public_html, вам придется прибегнуть к ненавистному методу "security by obscurity"
Создайте подкаталог со случайным именем для хранения файлов: public_html/RANDOMGARBAGE
Убедитесь, что каталог не доступен для просмотра. Отключите просмотр каталога (если можете), и поместите туда же документ по умолчанию (index.html?), так что даже если просмотр включен, вы не получите листинг каталога.
Не храните файлы с угадываемыми именами. Вместо того чтобы хранить их с идентификатором базы данных, храните их с соленым+хешированным именем: $crypted_filename = sha1($real_filename . 'some hard-to-guess salt text');
(конечно, если нужно, можно усложнить). Сохраните исходное имя файла в вашей базе данных. В итоге у вас получится что-то вроде:
public_html/RANDOMGARBAGE/5bf1fd927dfb8679496a2e6cf00cbe50c1c87145
public_html/RANDOMGARBAGE/7ec1f0eb9119d48eb6a3176ca47380c6496304c8
Передавайте файлы через PHP-скрипт - никогда не ссылайтесь на хэшированное имя файла напрямую
Download
который затем делает:
<?php
$fileID = (int)$_GET['fileID'];
$crypted_file = sha1($fileID . 'some hard-to-guess salt text');
$full_path = 'public_html/RANDOMGARBAGE/' . $crypted_file;
if (is_readable($full_path)) {
if(user_is_allowed_to_see_this_file()) {
/// send file to user with readfile()
header("Content-disposition: attachment; filename=$ORIGINAL_FILENAME");
readfile($full_path);
} else {
die("Permission denied");
}
} else {
/// handle problems here
die("Uh-oh. Can't find/read file");
}
Таким образом, пользователь никогда не увидит, какое у вас "s00per seekrit" имя файла, он просто увидит, что его браузер нажал . ..php?fileID=37
и начнется загрузка secret file.pdf
Кроме того, вы можете время от времени регулярно переименовывать специальный подкаталог во что-то другое, а также изменять текст соли (что потребует обновления всех хэшированных имен файлов новыми значениями sha1).
Поскольку PHP использует разрешения пользователя веб-сервера, невозможно ограничить доступ к файлам без:
Помещение их в базу данных считается вне DOCROOT. Для третьего варианта вы можете сделать файлы PDF в формате PHP, но, честно говоря, это было бы довольно запутанно.
Я рекомендую вам связаться с GoDaddy и узнать, есть ли у них способ настроить права доступа к файлам для отдельных каталогов.
Вы можете просто скрыть их. Это непонятная безопасность, но это похоже на ваш лучший вариант, если вы не можете либо уберечь их от корневого веб-сайта, либо найти способ указать серверу не обслуживать их напрямую.
Так что поместите их в какой-нибудь каталог со случайным именем:
asd8b8asd8327bh/123.pdf
asd8b8asd8327bh/124.pdf
asd8b8asd8327bh/125.pdf
...
Затем напишите себе небольшой PHP-скрипт, который будет отправлять соответствующие заголовки и передавать содержимое файла.
например:
<?PHP
//pdf.php
$id = $_GET['id'];
//make sure nobody is doing anything sneaky. is_numeric() might do the trick if the IDs are always integers.
if (!some_validation_passes($id)){
die();
}
<?php
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="'.$id.'.pdf"');
readfile('asd8b8asd8327bh'.$id.'pdf');
Теперь, приведенное выше действительно не лучше, чем просто обслуживание файлов напрямую (пока), поскольку люди все еще могут увеличивать параметр id в строке запроса.
Но вы должны уметь довольно легко понять, как обрабатывать авторизацию.
Сделать веб-папку недоступной через chmod. PHP по-прежнему сможет включать / требовать все, что есть на сервере, но пользователи никогда не смогут переходить к файлам.
Пример: Это установлено на 770, пользователь и группа IE могут читать / писать / выполнять, другие ничего не могут делать.