代码之家  ›  专栏  ›  技术社区  ›  Mazatec

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

  •  4
  • Mazatec  · 技术社区  · 16 年前

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

    image.php 
    

    如果用户登录,脚本将处理此操作

    login.php
    

    所有这些脚本都存储在名为:scripts的文件夹中

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

    我试图使用.htaccess阻止访问 deny from all 和 Limit GET, POST 但这阻止了系统工作,因为我根本无法访问这些文件。

    5 回复  |  直到 11 年前
        1
  •  4
  •   Gordon Haim Evgi    16 年前

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

    基本上,你想做的是 将所有请求路由到单个入口点 例如index.php和decide,调用哪个操作(脚本)来处理请求。然后你可以 将脚本和模板放在可公开访问的文件夹之外 或者,如果这是不可能的(在某些共享主机上),用htaccess保护文件夹,就像你已经做的那样(拒绝所有人)。

    要使用上传脚本,您需要一个类似 http://example.com/index.php?action=upload .

    一个超级简单的前端控制器就像

    $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请求,您还可以使用它来调整您的URL。这是MVC框架的常见做法,在这里和其他地方都有广泛的介绍。

        2
  •  1
  •   Atli    16 年前

    您不能真正阻止对文件的直接请求,并且仍然可以让其他请求访问它们。你能做的最好的就是掩盖他们的位置和控制 怎样 它们被访问。

    一种方法是创建一个php“switch”脚本,它将为您包含这些脚本,而不是让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'] 有一个薄弱的检查,以查看规则是否来自重写器,这意味着要防止对文件的直接请求。如果你知道它存在的话,很容易绕过它,但是对于机器人之类的随机请求是有效的。

    这样,直接请求 脚本/image.php 和 PHP?文件=III.PHP 将失败,但对任何图像文件的请求将触发 脚本/image.php 脚本。

        3
  •  0
  •   Peter    16 年前

    可以在.htaccess上设置“全部拒绝”,并从某些可访问目录中包含这些文件

        4
  •  0
  •   Justin Noel    16 年前

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

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

    这应该已经在httpd.conf文件中完成,如下所示:

    • addtype应用程序/x-httpd-php.php.phtml

    现在,image.php将需要某些post参数。除了实现上面提到的MVC体系结构之外,如果没有提供任何缺少的参数,您可以优雅、安全地处理它们。然后,用户可以直接访问页面,但不能对其进行任何操作。

        5
  •  0
  •   Stephan Muller    16 年前

    许多应用程序只是将脚本之类的文件放在与公用文件夹相同的根文件夹中,而不是公用文件夹(如/public_html/或/www/)。

    所以不 根目录/公共目录\html/和 根/公共HTML/脚本/

    但是 根目录/公共目录\html/和 根/脚本/

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