Ограничить доступ к файлам - только Прочитайте PHP [закрыт]

10
задан Chenmunka 19 August 2016 в 09:20
поделиться

4 ответа

Поскольку вы не можете разместить файлы нигде, кроме как в каталоге public_html, вам придется прибегнуть к ненавистному методу "security by obscurity"

  1. Создайте подкаталог со случайным именем для хранения файлов: public_html/RANDOMGARBAGE

  2. Убедитесь, что каталог не доступен для просмотра. Отключите просмотр каталога (если можете), и поместите туда же документ по умолчанию (index.html?), так что даже если просмотр включен, вы не получите листинг каталога.

  3. Не храните файлы с угадываемыми именами. Вместо того чтобы хранить их с идентификатором базы данных, храните их с соленым+хешированным именем: $crypted_filename = sha1($real_filename . 'some hard-to-guess salt text'); (конечно, если нужно, можно усложнить). Сохраните исходное имя файла в вашей базе данных. В итоге у вас получится что-то вроде:

    public_html/RANDOMGARBAGE/5bf1fd927dfb8679496a2e6cf00cbe50c1c87145 public_html/RANDOMGARBAGE/7ec1f0eb9119d48eb6a3176ca47380c6496304c8

  4. Передавайте файлы через 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).

7
ответ дан 4 December 2019 в 01:55
поделиться

Поскольку PHP использует разрешения пользователя веб-сервера, невозможно ограничить доступ к файлам без:

  • размещения их вне DOCROOT
  • Изменения конфигурации веб-сервера для запрета доступа к этим файлам
  • Изменение файла таким образом, чтобы он интерпретировался веб-сервером, таким образом скрывая его содержимое

Помещение их в базу данных считается вне DOCROOT. Для третьего варианта вы можете сделать файлы PDF в формате PHP, но, честно говоря, это было бы довольно запутанно.

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

1
ответ дан 4 December 2019 в 01:55
поделиться

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

Так что поместите их в какой-нибудь каталог со случайным именем:

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 в строке запроса.

Но вы должны уметь довольно легко понять, как обрабатывать авторизацию.

1
ответ дан 4 December 2019 в 01:55
поделиться

Сделать веб-папку недоступной через chmod. PHP по-прежнему сможет включать / требовать все, что есть на сервере, но пользователи никогда не смогут переходить к файлам.

Пример: Это установлено на 770, пользователь и группа IE могут читать / писать / выполнять, другие ничего не могут делать.

0
ответ дан 4 December 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: