Как я могу запретить из всех каталогов, но все же получить доступ к файлам с помощью сценариев, таких как PHP? - PullRequest
1 голос
/ 14 августа 2011

Я пытаюсь выяснить, как я могу запретить пользователям просматривать текстовый файл, но при этом обращаться к файлу (читать) с помощью PHP? Есть ли способ сделать это с помощью htaccess? РЕДАКТИРОВАТЬ: Новый для безопасности файлов, я готов попробовать что-нибудь новое!

Ответы [ 4 ]

3 голосов
/ 14 августа 2011

Это легко сделать, поместив файл .htaccess в папку, которую вы хотите заблокировать.Это содержимое .htaccess, являющееся deny from all.Тогда ваш веб-сервер не будет обслуживать страницы, но вы все равно сможете получить к ним доступ с помощью fopen, file_get_contents ect.

0 голосов
/ 25 сентября 2013

Хороший вопрос и есть несколько относительно простых вещей, которые вы можете сделать.

Например, вы можете сохранить текстовый файл ниже вашего публичного каталога.

публичный каталог будет выглядеть примерно так:

/home/site_folder/public_html/

ниже public будет что-то вроде:

/home/site_folder/key/

Например, файл с именем «key.ini», который хранится ниже публичного в папке подключей со следующим содержимым:

[key]
name="enter a name here"
text="enter random text here"

Вы можете позвонить, используя:

$ini_file = "path_to_file/key.ini"; // i.e. /home/site_folder/key/key.ini
$ini_array = parse_ini_file($ini_file);
$name = $ini_array['name'];
$text = $ini_array['text'];

Но тогда файл .ini - это не текст. Если ваш текстовый файл находится ниже общедоступного, он будет защищен от чтения по URL-адресу так же, как и приведенный выше INI-файл, и вы можете легко его прочитать, если предположить файл «password.txt», например:

$fh = fopen(password.txt,'r'); 
$password = fread($fh,100);
fclose($fh);

Если вы хотите защитить содержимое файла, вы можете использовать простой асинхронный метод, такой как этот, для шифрования данных , в то же время используя указанный выше файл key.ini в качестве ключа шифрования :

function getAesKey() {
    if ( file_exists(key.ini) ) {
        $args = parse_ini_file(key.ini);
        if ( isset($args['name']) AND isset($args['text']) ) {
            return md5( $args['name'].$args['text'] );
        }
    }
}

function encrypt_data($data) {
    //AES256 symetric encryption
    $key = getAesKey();
    if(32 !== strlen($key)) $key = hash('SHA256', $key, true);
    $padding = 16 - (strlen($data) % 16);
    $data .= str_repeat(chr($padding), $padding);
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16));
}

ПРИМЕЧАНИЕ . После создания файла вы можете изменить его разрешения только на чтение.

Итак, что-то вроде этого создаст файл и добавит зашифрованное содержимое:

    $fh = fopen(password.txt, "w");  //Open for writing
    fwrite($fh, encrypt_data("My very secure password"));
    fclose($fp);

Функция дешифрования содержимого:

function decrypt_data($data) {
$key = getAesKey();
if(32 !== strlen($key)) $key = hash('SHA256', $key, true);
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16));
$padding = ord($data[strlen($data) - 1]);
return substr($data, 0, -$padding);
}

Вы могли бы добавить дополнительную функцию для возврата фактического контента вместо того, чтобы писать каждый код каждый раз:

function getPassword() {
$fh = fopen(password.txt, 'r');
$password = fread($fh,100);
fclose($fh);
return decrypt_data($password);
}

Что означает, что вы называете это так:

$password = getPassword();

Содержимое вашего файла паролей, если бы к нему обращались, выглядело бы примерно так:

v?��cr���bV��@

С файлом ниже общедоступного, никто не сможет перейти к файлу, например: www.yoursite.com/text_file.txt, чтобы просмотреть его. И если они каким-то образом получат доступ к вашему серверу и найдут файл паролей: они не смогут расшифровать зашифрованный контент без ключа. Но они, скорее всего, просто выведут контент, используя вашу функцию.

У меня обычно есть файл класса шифрования и файл key.ini в одном из включаемых каталогов, поэтому он недоступен в текущем пути учетной записи хостинга. Для доступа к нему вам понадобится root-доступ к серверу. Таким образом, если у кого-то есть копия всего вашего кода, он не сможет разблокировать файл без ключевого файла.

0 голосов
/ 14 августа 2011

Например, во Vbulletin я использую простой .htaccess, чтобы защитить папку include от чтения config.php. Вы можете создать файл .htaccess в каталогах, которые вы хотите защитить, с помощью следующего:

<Files *.php>
order deny,allow
deny from all
</Files>

Не уверен, работает ли подстановочный знак, в моем случае я использовал

<Files config.php>
order deny,allow
deny from all
</Files>

Удачи!

0 голосов
/ 14 августа 2011

Для этого не нужно использовать htaccess: просто начните имя файла с точки, и apache автоматически проигнорирует его по умолчанию.Я использую этот трюк, чтобы скрыть целые каталоги кода php.

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