$ _SERVER vartiables被丢弃在运行CGI的主机上

时间:2010-08-23 10:08:30

标签: php cgi

由于我的托管设置(在CGI接口上运行),变量$ _SERVER ['PHP_AUTH_USER']和$ _SERVER ['PHP_AUTH_PW']将返回为空。是否有任何工作要让他们工作,因为我需要使用它们进行身份验证。我无法移动托管或更改界面。

我通过curl发送auth请求到url / api / projects / ... 由modrewrite解释,然后根据规则处理。

当我在运行MAMP的本地主机上尝试此操作时,或者我使用其他主机时它可以正常工作(不使用CGI接口)但是在服务器上我需要它运行,变量会被删除!

有人可以帮我吗?

5 个答案:

答案 0 :(得分:2)

根据手册,这些变量仅在PHP作为Apache模块运行时可用。 http://php.net/manual/en/features.http-auth.php

您可以尝试与托管服务提供商交谈,看看他们是否可以在CGI发送请求时将其提供给您。

答案 1 :(得分:1)

根据docs,这两个变量在CGI模式下不可用。

  

PHP中的HTTP身份验证挂钩仅在作为Apache模块运行时才可用,因此在CGI版本中不可用。

然而,深入研究用户贡献的笔记。人们声称有许多成功的解决方法,例如this one。也许值得一试。

答案 2 :(得分:0)

如果是自动使用,则根本不需要使用HTTP身份验证。只需发送一个秘密令牌作为凭据。

http://example.com/service.php?auth=A235BDA74456CC3

答案 3 :(得分:0)

默认情况下,Apache Web服务器会阻止CGI应用程序的HTTP_AUTHORIZATION环境变量,这是PHP用来填充PHP_AUTH_USER / PASS的内容。通过重新编译设置了SECURITY_HOLE_PASS_AUTHORIZATION标志的Apache,可以关闭此行为。

“安全漏洞”是共享服务器上的任何其他用户都能够看到用户通过您的站点进行身份验证的密码。是否实际上是一个安全漏洞取决于你;经常没有。

如果您使用的是廉价共享服务器,那么您很可能无法重新编译Apache。

  

你知道是否可以使用类似于这里的工作

是的,如果您有mod_rewrite,它应该可以。 (关于它可能是一个“安全漏洞”的警告仍然适用。)

然而,它是丑陋的,并使部署复杂化。同样,给出的示例脚本存在一些问题(使用explode会丢弃密码中的任何:个字符,而echo则没有正确使用htmlspecialchars()介绍XSS漏洞。)

这种废话是HTTP身份验证越来越不受欢迎的原因之一。大多数网站都使用基于表单/ cookie的身份验证。对于API,您通常会拥有自己的基于令牌的身份验证,而不是依赖于基本身份验证。

答案 4 :(得分:0)

结帐

https://github.com/symfony/symfony/issues/1813

有关此问题的讨论和详细的解决方法。