我怎么能拒绝从所有目录,但仍然访问文件与脚本,如PHP


How can I deny from all directories, but still access the files with scripts like PHP?

我想弄清楚我怎么能拒绝用户从查看文本文件,但仍然访问文件(读)与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访问。这样,如果有人有你所有代码的副本,他们就无法在没有密钥文件的情况下解锁文件。