我怎样才能拒绝所有目录,但仍然使用PHP之类的脚本访问文件?

我怎样才能拒绝所有目录,但仍然使用PHP之类的脚本访问文件?,php,security,apache,.htaccess,directory,Php,Security,Apache,.htaccess,Directory,我试图弄明白,如何才能拒绝用户查看文本文件,但仍然使用PHP访问该文件(读取)?有没有办法用htaccess做到这一点? 编辑:新的文件安全,我准备尝试任何新的 无需使用htaccess:只需在文件名开头加上一个点,默认情况下apache会自动忽略它。我使用这个技巧来隐藏php代码的整个目录。您可以通过将.htaccess文件放在要阻止的文件夹中轻松做到这一点。此.htaccess的内容被所有人拒绝。然后,您的web服务器将不会提供这些页面,但您仍然可以使用fopen、file\u get\u

我试图弄明白,如何才能拒绝用户查看文本文件,但仍然使用PHP访问该文件(读取)?有没有办法用htaccess做到这一点?
编辑:新的文件安全,我准备尝试任何新的

无需使用htaccess:只需在文件名开头加上一个点,默认情况下apache会自动忽略它。我使用这个技巧来隐藏php代码的整个目录。

您可以通过将.htaccess文件放在要阻止的文件夹中轻松做到这一点。此.htaccess的内容被所有人拒绝。然后,您的web服务器将不会提供这些页面,但您仍然可以使用
fopen
file\u get\u contents
等访问这些页面。

例如,在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>

命令拒绝,允许
全盘否定

祝你好运

好问题你可以做一些相对简单的事情

例如,您可以在公共目录下存储一个文本文件

公共目录类似于:

/home/site_folder/public_html/
/home/site_folder/key/
下面是一些类似于:

/home/site_folder/public_html/
/home/site_folder/key/
例如,一个名为“key.ini”的文件存储在sub-key文件夹的public下面,包含以下内容:

[key]
name="enter a name here"
text="enter random text here"
    $fh = fopen(password.txt, "w");  //Open for writing
    fwrite($fh, encrypt_data("My very secure password"));
    fclose($fp);
您可以使用以下方法调用此函数:

$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文件不是文本。如果您的文本文件低于public,则可以通过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));
}
注意,创建文件后,您可能希望将其权限更改为只读

因此,类似这样的操作将创建文件并添加加密内容:

[key]
name="enter a name here"
text="enter random text here"
    $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��@
如果您的密码文件被访问,其内容将如下所示:

$password = getPassword();
v?��cr���bV��@
由于下面的文件是公共的,没有人能够导航到像www.yoursite.com/text_file.txt这样的文件来查看它。如果他们确实以某种方式访问了您的服务器并找到了密码文件:如果没有密钥,他们将无法解密加密内容。但是他们可能只是使用您的函数输出内容


我通常将我的加密类文件和key.ini放在其中一个include目录中,因此在当前托管帐户路径中不可用。要访问此文件,您需要对服务器具有root访问权限。这样,如果有人拥有您所有代码的副本,他们将无法在没有密钥文件的情况下解锁该文件。

是否必须使用htaccess?为什么不把它埋在你的文档根目录下呢?我想那不是apache的特性。可能是您的系统管理员设置了一些指令,使apache不提供带有点的目录和文件。好吧,我自己管理我的所有机器,我可以说在ubuntu/debian/redhat上,全新的apache安装不会提供点文件。在我看过的至少3台共享主机(godaddy、1和1以及dreamhost)上,同样的情况也适用。我会看看apache的文档,但只要我一直在使用apache(过去十年左右),它就从来没有提供过点文件或点目录的内容。是的,但它仍然会为xml文件返回一个错误?为什么会这样<代码>警告:DOMDocument::load()[DOMDocument.load]@Pete您使用的是相对url吗?您不能使用绝对(http)url,否则将通过ApacheYes获取。是的,我现在更改了大多数url。但是我的iframe和一些图片仍然无法加载。知道为什么吗?@Pete任何HTML请求的内容(例如通过src属性)都将通过Apache从客户端计算机请求。您需要允许通过apache为这些文件提供服务,以便它们工作。您可以使用
allow from all