Хороший вопрос и есть несколько относительно простых вещей, которые вы можете сделать.
Например, вы можете сохранить текстовый файл ниже вашего публичного каталога.
публичный каталог будет выглядеть примерно так:
/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-доступ к серверу. Таким образом, если у кого-то есть копия всего вашего кода, он не сможет разблокировать файл без ключевого файла.