【问题标题】:PHP and .htaccess authentication solutionPHP 和 .htaccess 认证解决方案
【发布时间】:2012-12-13 13:16:03
【问题描述】:

这是布局:

web root
  - admin (dir)
      - index.php
      - js
      - img
      - other files / dirs
  - dir
  - files

到目前为止,我使用 .htaccess passwd 保护了管理目录,因为我希望对该目录中的所有文件(包括 js 脚本、jpg、pdf 等)进行完全访问控制。另一方面,我的自定义 CMS 使用 PHP 会话/cookie 为其他 URL 提供身份验证。我想要完成的是对 .htaccess 受保护的目录使用相同的 PHP 身份验证,避免弹出已通过 PHP 身份验证用户的用户/密码提示。总结:

  • 我希望管理员目录使用 .htaccess 规则进行身份验证
  • 如果用户已经使用 PHP 进行了身份验证(以 HTML 表单登录,在未受保护的文件上),则在访问管理目录内容时绕过第二个 .htaccess 身份验证过程
  • 如果未经 PHP 身份验证的用户尝试访问管理目录中的内容,则应触发 HTTP 身份验证弹出窗口

我读过的大部分内容都建议将管理目录移到 Web 根目录之外,并使用 readfile 从 PHP 脚本访问文件,我不想这样做。该目录上有动态内容,也有静态内容。我知道 apache 会在加载任何资源之前触发 auth 弹出窗口,所以问题是如何让 apache 知道用户已经通过身份验证。还有其他建议/解决方法吗?

【问题讨论】:

标签: php apache .htaccess


【解决方案1】:

您可以使用.htaccess 文件中的SetEnvIf 变量来检查是否设置了某个Cookie 值。例如(这不是很安全,只是为了说明):

AuthType Basic
AuthName "Protected Login"
AuthUserFile "/path/to/.htpasswd"
AuthGroupFile "/dev/null"
SetEnvIf Cookie PHPSESSID=.* PASS=1
Order deny,allow
Deny from all
Allow from env=PASS
Require valid-user
Satisfy any

SetEnvIf Cookie PHPSESSID=.* PASS=1 行检查是否使用 PHP 会话 ID 设置了 Cookie,如果是,则足以 Satisfy 进行身份验证过程,Allow from env=PASS 使其跳过登录提示,如果这是真的。

再一次,这个例子不是很安全,因为当session_start() 被调用而没有成功的身份验证尝试时已经设置了 PHP 会话 cookie,所以最好设置一个更神秘/随机的 cookie 值,这很难猜到。例如:

SetEnvIf Cookie AJNC3Z921dmc4O8P2 PASS=1

这样,如果您在通过 PHP 成功验证时将 cookie 值设置为 AJNC3Z921dmc4O8P2,这将足以通过验证过程。确保设置适当的 cookie 过期时间,以避免人们长时间通过登录提示。

【讨论】:

  • 效果很好,感谢 Oldskool!现在不知道整个 cookie 的安全性如何,但无论如何我都会在每个 PHP 脚本中仔细检查访问该目录上动态内容的适当权限。我建议在正则表达式上使用结束 $,如下所示:SetEnvIf Cookie AUTHCOOKIE=randomstring$ PASS 1,否则 randomstring1 将匹配。
  • 这是一个非常实用的解决方案,也或多或少对我有用。但我正在为此苦苦挣扎,因为我需要设置环境变量REMOTE_USER,以便我可以将登录用户的用户名传递给受保护子目录中的php。有没有办法提取任何其他数据并基于它设置环境变量?有关我要问的更多详细信息,请参见此处:stackoverflow.com/questions/63207549/…
猜你喜欢
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
相关资源
最近更新 更多