我如何拒绝所有目录,但仍然使用PHP等脚本访问文件?

时间:2011-08-14 03:56:13

标签: php security apache .htaccess directory

我试图找出如何拒绝用户查看文本文件但仍然使用PHP访问文件(读取)?有没有办法用htaccess做到这一点? 编辑:文件安全新手,我想尝试任何新的东西!

4 个答案:

答案 0 :(得分:3)

您可以通过将.htaccess文件放在要阻止的文件夹中来轻松完成此操作。 .htaccess的内容为deny from all。然后,您的网络服务器不会提供这些网页,但您仍然可以使用fopenfile_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访问服务器。这样,如果有人拥有您所有代码的副本,他们将无法在没有密钥文件的情况下解锁文件。