【发布时间】:2021-11-30 03:26:05
【问题描述】:
我一直在 HTTP Basic Authentication 上让自己跟上进度。
我了解这从根本上说是一种不安全的访问机制(即使通过 HTTPS 使用,也应该如此),但我认识到 HTTP Basic Auth 并非完全没有实用性,我想熟悉它,即使很少出现我可能会部署它的情况。
到目前为止我的理解:
经过一番阅读,我明白了:
- 服务器可以通过返回
401 (unauthorised)请求资源授权 -
WWW-Authenticate响应标头确定用于访问此资源的身份验证将是Basic -
HTTP Basic Authentication要求: - a) 用户通过浏览器生成的控制台提交用户名和密码;或者那个
- b) 手动成功提交后,相同的用户名和密码组合将通过
Authorization请求标头自动提交到每个 HTTP 请求
到目前为止,一切都很好。
需要注意的问题:
我还了解到 HTTP Basic Auth 存在一些问题,这些问题随着时间的推移而演变,例如:
- 部分浏览器不再接受
https://mylogin:mypassword@example.com/my-resource.html等URL语法 - 如果 PHP 正在通过 CGI 或 FastCGI 运行,那么提交的 授权凭据 将不会传递给
$_SERVER['HTTP_AUTHORIZATION'],除非是 hack已部署 - 最常见的建议是通过.htaccess mod_rewrite重写 URL
以及从一开始就一直存在的其他问题,例如:
- “注销”HTTP Basic Auth 是一个非常重要的问题,因为它从未打算或设计为具有注销机制
拼图缺失的部分:
但是,我仍然感到困惑,因为即使用户(或Authorization 请求标头)提交了有效的身份验证凭据......服务器如何知道它们是有效的?
在我遇到的每个讨论 HTTP 基本身份验证 机制的文档中,讨论都没有到达凭据实际经过身份验证的那一点。
问题:
提交的凭据实际上是如何经过身份验证的?
服务器将提交的凭据与... 任何东西进行比较?
额外问题:
NB 这与我上面的主要问题有关,因为我使用 .htaccess 和 queryString 参数来传递凭据(见下文)呈现了 HTTP Basic 的部署Auth 完全多余 - 如果我沿着这条路线走,我可以单独使用 .htaccess 和 queryString 参数传递凭据,我根本不需要部署 HTTP Basic Auth。
作为一种规避 CGI/FastCGI 问题的方法,我经常看到引用这些 .htaccess 行的变体:
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
或
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]
或
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
尽管我尝试使用这些方法中的任何一种来使用凭据填充 PHP 环境变量都被证明是不成功的。
相反,我已经成功部署了以下内容(使用queryString 参数而不是环境变量):
# WRITE HTTP BASIC AUTHENTICATION CREDENTIALS TO QUERY STRING
RewriteCond %{HTTP:Authorization} [NC]
RewriteCond %{QUERY_STRING} ^basicauth=login$ [NC]
RewriteRule ^my-document.php https://example.com/my-document.php?basicauth=login-submitted&credentials=%{HTTP:Authorization} [NC,L]
将凭据附加为queryString 参数。
我对上面自己的mod_rewrite 解决方案并不满意,但我很难让环境变量完全正常工作。
我无所事事地想知道在后者方面我是否遗漏了一些明显的东西 - 比如......它们是否会在我的 PHP 配置中被关闭?
(如果是这样,我需要在PHPInfo 中检查哪些条目以确认它们实际上已打开并接受通过mod_rewrite 传输给它们的值?)
【问题讨论】:
-
“将凭据附加为 queryString 参数” - 尽管第一个 条件 似乎缺少某些内容 - 写它永远不会匹配? “我根本无法让环境变量工作” - 大概您尝试过像
SetEnvIf ^ ^ TEST=1或RewriteRule ^ - [E=TEST:1]这样的简单测试?这仍然没有设置环境变量吗? (你如何检查环境变量?使用 phpinfo()?).htaccess中还有其他指令吗?重写引擎的任何循环都会导致 env var 在每个附加循环上使用REDIRECT_前缀重命名。 -
您是否专门询问有关 PHP 的 HTTP 基本身份验证?
-
@MrWhite - 经过反思,我想我可能是的。但我现在只是在下面讨论了在非 LAMP 堆栈中使用 HTTP Basic Auth 之后才得出结论。 (注意我没有 Node.js 背景。我今年才开始从 LAMP 分支到 Deno + koa,除此之外,自 2009 年以来我只知道 LAMP。之前2009 年,我从来没有接触过服务器端。)
-
好的,但是使用 Apache 作为身份验证器是 HTTP Basic Auth IMO 的明显选择。 服务器 然后确实“知道”凭据是否有效。无需为传递
Authorization标头而烦恼。尽管我仍然很好奇为什么您似乎没有看到 _any_(?) 环境变量被传递给 PHP?您是否尝试了一个简单的测试并检查了$_SERVER超全局?
标签: php .htaccess http-headers basic-authentication http-authentication