我试图找出如何拒绝用户查看文本文件但仍然使用PHP访问文件(读取)?有没有办法用htaccess做到这一点? 编辑:文件安全新手,我想尝试任何新的东西!
答案 0 :(得分:3)
您可以通过将.htaccess文件放在要阻止的文件夹中来轻松完成此操作。 .htaccess的内容为deny from all
。然后,您的网络服务器不会提供这些网页,但您仍然可以使用fopen
,file_get_contents
等访问这些网页。
答案 1 :(得分:0)
不需要为此使用htaccess:只需用点启动文件名,默认情况下apache会自动忽略它。我用这个技巧隐藏了PHP代码的整个目录。
答案 2 :(得分:0)
例如在Vbulletin中,我使用一个简单的.htaccess来保护includes文件夹,使config.php不可读。您可以使用以下命令在要保护的目录中创建.htaccess文件:
<Files *.php>
order deny,allow
deny from all
</Files>
不确定通配符是否有效,在我的情况下我使用了
<Files config.php>
order deny,allow
deny from all
</Files>
祝你好运!
答案 3 :(得分:0)
好问题,你可以做很多相对简单的事情。
例如,您可以在公共目录下存储文本文件。
公共目录将类似于:
/home/site_folder/public_html/
在公共场合下面会是这样的:
/home/site_folder/key/
例如,一个名为“key.ini”的文件存储在子密钥文件夹中的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文件不是文本。如果您的文本文件低于公共文件,那么通过网址读取就像上面的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来查看它。如果他们以某种方式访问您的服务器并找到密码文件:他们将无法在没有密钥的情况下破译加密内容。但他们可能只是使用你的功能输出内容。
我通常在其中一个include目录中有我的加密类文件和key.ini,因此在当前的主机帐户路径中不可用。要访问它,您需要root访问服务器。这样,如果有人拥有您所有代码的副本,他们将无法在没有密钥文件的情况下解锁文件。