如何使用.htaccess保护服务器目录

时间:2009-12-16 11:15:23

标签: php .htaccess directory

我设计了一个网站,在其中我有一系列与我的系统交互的PHP脚本。例如,如果用户上传图像,则由脚本

处理
image.php 

如果用户登录,则由脚本处理

login.php

所有这些脚本都存储在名为:scripts

的文件夹中

如何确保某人无法访问这些网页,但是仍然可以确保系统可以使用这些网页?我想确保PHP页面接受帖子值,获取值并可以重定向到其他页面,但不能通过地址栏直接访问或下载?

我尝试使用deny from allLimit GET, POST阻止使用.htaccess进行访问,但这阻止了系统正常工作,因为我根本无法访问这些文件。

5 个答案:

答案 0 :(得分:4)

使用htaccess阻止文件会使请求者无法访问文件,例如页面的访问者。因此,您需要一个代理文件来将访问者的请求传递给文件。为此,请查看MVC patternFront Controller pattern

基本上,您要做的是将所有请求路由到单个入口点,例如index.php并从那里决定调用哪个动作(您的脚本)来处理请求。然后你可以将你的脚本和模板放在可公开访问的文件夹之外,或者,如果这是不可能的(在某些共享主机上),用你已经做过的htaccess保护文件夹(DENY FROM ALL)然后。< / p>

要使用上传脚本,您需要有http://example.com/index.php?action=upload之类的网址。

超简单的FrontController就像

一样简单

$scriptPath      = 'path/to/your/scripts/directory/';
$defaultAction   = 'action404.php';
$requestedAction = $_GET['action']; // you might want to sanitize this

switch($action) {
    case 'upload':
        $actionScript = 'image.php';
        break;
    case 'login':
        $actionScript = 'login.php';
        break;
    default:
        $actionScript = $defaultAction;
}
include $scriptPath . $actionScript;
exit;

然后,您的actionScript将执行您对请求所需的所有操作,包括重定向,数据库访问,身份验证,上传内容,呈现模板等 - 您认为必要的任何内容。上例中的默认操作可能如下所示:

<?php // action404.php
    header('HTTP/1.1 404 File Not Found');
    fpassthru('path/to/template/directory/error404.html');

numerous implementations of the FrontController pattern in PHP。有些简单,有些复杂。 CodeIgniter framework使用了一个轻量级的MVC / FrontController实现,如果这对你来说是新手,可能不会太过分。

与上面提到的Atli一样,您可以使用mod_rewrite强制所有对index.php的请求,您也可以使用它来提升您的网址。这是MVC框架的常见做法,并已在此处和其他地方广泛讨论。

答案 1 :(得分:1)

您无法真正阻止对文件的直接请求,并且仍然可以让其他请求仍然可以访问它们。您可以做的最好的事情是屏蔽它们的位置,并控制 的访问方式。

您可以采用的一种方法是创建一个PHP“切换”脚本,其中包含脚本,而不是让Apache直接请求它们。

例如,如果您的scripts/image.php规则目标为switch.php?file=image.php,则有点像:

RewriteRule ([^\.]+\.(jpe?g|png|gif)$ switch.php?file=image.php&rw=1&meta=$1 [L,QSA]

您可以将deny from all添加到scripts/.htaccess文件,并在switch.php文件中执行此操作。

<?php
/** File: switch.php **/
$allowed_files = array(
    'login.php',
    'image.php'
);
$script_dir = 'scripts/';
if(isset($_POST['rw']) && in_array($_REQUEST['file'], $allowed_files)) {
    include $script_dir . $allowed_files[$_REQUEST['file']];
}
else {
    header('HTTP/1.1 404 File Not Found');
    include 'error404.html'; // Or something to that effect.
}
?>

$_POST['rw']存在弱检查,以查看规则是否来自RewriteRule,旨在阻止对文件的直接请求。如果你知道它在那里很容易绕过,但对机器人等随机请求有效。

这样,对scripts/image.phpswitch.php?file=image.php的直接请求都会失败,但对任何图像文件的请求都会触发scripts/image.php脚本。

答案 2 :(得分:0)

您可以在.htaccess上设置deny,并在某些可访问目录中包含这些文件

答案 3 :(得分:0)

我想确保PHP页面接受post值,获取值并可以重定向到其他页面,但不能通过地址栏直接访问或下载?

只要Apache配置为将所有.php文件与PHP应用程序相关联,就没有人可以自行下载PHP内容。所以,如果有人浏览到“mysite.com/image.php”,PHP就会运行。用户不会看到您的PHP内容。

这应该已经在您的httpd.conf文件中完成:

  • AddType application / x-httpd-php .php .phtml

现在,image.php将期待某些帖子参数。如上面提到的Atli建议的那样,如果没有实现MVC架构,如果没有提供,您可以优雅安全地处理任何缺失的参数。然后,用户可以直接访问该页面,但不能对其进行任何操作。

答案 4 :(得分:0)

许多应用程序只是将脚本等文件放在公共文件夹(例如/ public_html /或/ www /)文件夹中,但与公用文件夹位于同一根文件夹中。

所以没有 root / public_html /和 根/的public_html /脚本/

但 root / public_html /和 根/脚本/

访问者无法访问公用文件夹上方文件夹中的任何内容,但通过在/public_html/index.php中指定文件'../scripts/yourscript.php'PHP可以访问这些文件和访问者不能。 (文件夹../表示“在文件夹层次结构中向上移动一步”)