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

Sti*_*gus 5 php apache .htaccess

这是布局:

web root
  - admin (dir)
      - index.php
      - js
      - img
      - other files / dirs
  - dir
  - files
Run Code Online (Sandbox Code Playgroud)

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

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

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

Old*_*ool 8

您可以使用SetEnvIf.htaccess文件中的变量来检查是否设置了某个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
Run Code Online (Sandbox Code Playgroud)

该行SetEnvIf Cookie PHPSESSID=.* PASS=1检查Cookie是否设置了PHP会话ID,如果是,则这Satisfy对于身份验证过程就足够了,Allow from env=PASS如果这是真的,则跳过登录提示.

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

SetEnvIf Cookie AJNC3Z921dmc4O8P2 PASS=1
Run Code Online (Sandbox Code Playgroud)

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