我想弄清楚我怎么能拒绝用户从查看文本文件,但仍然访问文件(读)与PHP?有办法做到这一点与htaccess?编辑:文件安全新手,我准备尝试任何新东西!
您可以通过在您想要阻止的文件夹中放置一个.htaccess文件来轻松地做到这一点。.htaccess的内容是deny from all
。然后你的web服务器将不提供页面,但你仍然可以访问他们与fopen
, file_get_contents
等
不需要使用htaccess:只需在文件名的开头加上一个点,apache将默认自动忽略它。我使用这个技巧来隐藏php代码的整个目录
例如,在Vbulletin中,我使用一个简单的。htaccess来保护包含文件夹不受config.php可读的影响。你可以在你想要保护的目录中创建一个.htaccess文件,命令如下:
<Files *.php>
order deny,allow
deny from all
</Files>
不确定是否通配符工作,在我的情况下,我使用
<Files config.php>
order deny,allow
deny from all
</Files>
祝你好运! 好问题你可以做一些相对简单的事情。
例如,您可以在公共目录下存储一个文本文件。
公共目录应该是这样的:
/home/site_folder/public_html/
public下面的类似于:
/home/site_folder/key/
例如,一个名为"key.ini"的文件存储在sub key文件夹public下面,其内容如下:
[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��@
如果文件位于public下面,则没有人能够导航到该文件,例如:www.yoursite.com/text_file.txt来查看它。如果他们确实以某种方式进入了你的服务器并找到了密码文件:没有密钥,他们就无法破译加密的内容。但是他们可能只是使用你的函数输出内容。
我通常把我的加密类文件和key.ini放在一个包含目录中,所以在当前主机帐户路径中不可用。要访问它,您需要对服务器进行root访问。这样,如果有人有你所有代码的副本,他们就无法在没有密钥文件的情况下解锁文件。