PHP和.htaccess身份验证解决方案

时间:2012-12-28 08:25:01

标签: php apache .htaccess

这是布局:

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

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

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

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

1 个答案:

答案 0 :(得分:8)

您可以使用.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检查Cookie是否设置了PHP会话ID,如果是,那就足以Satisfy身份验证过程和Allow from env=PASS使其跳过登录提示如果这是真的。

同样,这个例子不是很安全,因为在没有成功的身份验证尝试的情况下调用session_start()时已经设置了PHP会话cookie,因此最好设置一个更难以加密/随机的cookie值。猜测。例如:

SetEnvIf Cookie AJNC3Z921dmc4O8P2 PASS=1

这样,如果您通过PHP成功进行身份验证后设置cookie值AJNC3Z921dmc4O8P2,这将足以通过身份验证过程。确保设置正确的cookie过期时间,以避免人们长时间通过登录提示。