【问题标题】:Password Protecting Web Directories and Files密码保护 Web 目录和文件
【发布时间】:2012-10-03 15:37:57
【问题描述】:

用户进入我的网站并到达主页,他/她应该始终且仅在主页上。所有其他文件都是由主页运行的脚本,但用户永远不应导航到它们。这是我的目录布局:

他们将到达 Front.php,并且应该始终留在 Front。所以我创建了一个包含以下代码的 htaccess 文件:

DirectoryIndex Front.php index.html
AuthType Basic
AuthName "Login"
AuthUserFile /disks/*/*/*/.htpasswd
Require valid-user

目前,一切都需要身份验证。但我希望所有 except Front.php 都需要身份验证。如何从身份验证中排除 Front.php?

此外,此身份验证会阻止脚本运行还是只是阻止用户通过 url 导航 TO 文件?

【问题讨论】:

    标签: php html .htaccess authentication .htpasswd


    【解决方案1】:

    你说你不希望能够输入其他脚本,但你给它添加了身份验证。

    如果您不想直接执行这些脚本,最好将它们移出 public_html 文件夹,这样就根本无法从外部访问它们。您仍然可以在 front.php 中包含/要求它们。

    可以轻松地将管理脚本移动到一个子目录中,您可以在其中添加来自 .htaccess 的身份验证。如果您想为某些文件添加身份验证,但不是全部,您还可以选择从 PHP 脚本发送所需的标头。

    您经常会在文件开头看到这样的检查:

    defined('MYAPPDEFINE') || die('No direct access allowed');
    

    在入口页面(index.php,front.php,随便什么),可以添加这一行:

    define('MYAPPDEFINE', 'Whatever value');
    

    这样,每一个被直接调用的文件都会立即死亡并终止,但是当从front.php中包含时,检查成功,文件被包含。

    【讨论】:

    • 只是想解决这个问题。因此,如果我将身份验证添加到文件,例如 Insert.php。那么Front.php调用它时,如果你没有认证,它会不会响应?
    • +1 指出了显而易见的事实:组织值得一千行代码! @CharlieYabben“称呼它”是什么意思?如果包含或需要它们,则它们不需要身份验证。但是,如果它们位于 .htaccess 保护目录中,并通过 HTTP 访问,它们将触发登录请求。
    • 是的,但您可以对作为管理页面入口文件的文件执行此操作。根本不是条目的页面应该不能被直接调用。最好将它们移到一个目录上,这样就无法通过 uri 访问它们,和/或只是让它们die(在答案中添加了一个额外的段落)。
    【解决方案2】:

    使用此 .htaccess 内容来防止人们请求除 front.php 之外的任何内容:

    RewriteEngine On
    
    RewriteCond %{THE_REQUEST} !front.php [NC]
    RewriteRule .* - [F,L]
    

    现在只有 fron.php 可供访问您的 apache 的任何人使用。

    顺便说一句 - 据我所知 - 您可以强制 Apache 对特定目录中的任何内容进行身份验证,但不能对单个文件进行身份验证。

    【讨论】:

    • 出于某种原因,这会阻止对包括 Front.php 在内的所有文件的访问。你的意思是说RewriteCond %{REQUEST_URI} !Front.php [NC]
    • @Charlie:实际上 [NC] 标志表示 NoCase,这意味着无论大小写如何,都将禁止访问除 FRONT.PHP、FrONT.pHP 等之外的任何文件。我检查了这些行,它们工作正常。如果对您不起作用 - 阻止您的其他规则创建 .htaccess,首先仅使用这 3 行进行测试。
    【解决方案3】:

    使用这个规则集:

    <Filesmatch "^((?!Front\.php).)*$">
    AuthType Basic
    AuthName "Login"
    AuthUserFile /disks/*/*/*/.htpasswd
    Require valid-user
    </Filesmatch>
    
    <Files "Front.php">
    allow from all
    </Files>
    

    【讨论】:

    • 追加到现有的.htaccess文件中(放在底部)?试过还是要认证才能访问 Front.php
    • @CharlieYabben:我已经更新了我的答案。您需要为 Front.php 之外的所有文件指定密码规则。检查我更新的答案。
    • @CharlieYabben:很奇怪,因为它对我有用。 Front.php 在没有身份验证的情况下运行,并且对于每个其他文件,它都会要求我输入用户名/密码..
    • 我应该在这之前/之后放些什么吗?我在 apache 服务器上运行,所以我必须启用任何设置吗?
    • 检查 httpd.conf 是否允许 .htaccess 覆盖。另外,您是否说现在所有文件都受密码保护?
    【解决方案4】:

    现在,一切都需要身份验证。但我希望除 Front.php 之外的所有内容都需要身份验证。如何从身份验证中排除 Front.php?

    试试:

    SetEnvIfNoCase Request_URI ^/Front.php norequire_auth=true
    
    # Auth stuff
    AuthType Basic
    AuthName "Login"
    AuthUserFile /disks/*/*/*/.htpasswd
    
    # Setup a deny/allow
    Order Deny,Allow
    # Deny from everyone
    Deny from all
    # except if either of these are satisfied
    Satisfy any
    # 1. a valid authenticated user
    Require valid-user
    # or 2. the "require_auth" var is set
    Allow from env=norequire_auth
    

    这使用Satisfy 指令并将其设置为any,这意味着Require valid-userAllow 就足够了。变量 norequire_auth 仅在 URI 为 /Front.php 时设置。如果需要,您可以通过包含其他 SetEnvIfNoCase 指令来添加其他列入白名单的 URI。

    此外,此身份验证会阻止脚本运行还是只是阻止用户通过 url 导航到文件?

    如果您通过includerequire 包含脚本,它不会阻止脚本运行。但是,如果您直接链接Front.php 的 HTML 内容到它们,则会弹出 Front.php 的登录对话框。

    【讨论】:

    • 你的访问方式很聪明!
    • @JonLin 这就是我的 htaccess 文件现在的样子:htaccess。但是当我导航到www.domain.com/Folder/Front.php 时,它仍然需要身份验证。任何想法为什么?
    • @CharlieYabben 好吧,如果/Folder/Front.php 是您要排除的那个,那么您需要将它放在SetEnvIfNoCase 的正则表达式中。即^/Folder/Front.php
    • @JonLin 哦,这个放在根目录吗?我在帖子中显示的目录图像只是一个较大目录中的 1 个文件夹,它是 www.domain.com/Folder
    • @CharlieYabben 不,htaccess 文件进入您要保护的目录,但 Request_URI 将是 URL 中主机名之后的所有内容,所以 http://www.domain.com 之后的所有内容
    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多