如何在PHP中使用基本HTTP身份验证?

evrscar2  于 2023-11-16  发布在  PHP
关注(0)|答案(6)|浏览(171)

我尝试使用Basic HTTP Authentication并遵循PHP手册页上的示例。但它对我不起作用。变量$_SERVER['PHP_AUTH_USER']似乎没有设置。当用户尝试登录时,用户会被提示新的登录对话框。服务器运行PHP 5.3.3,我尝试使用Google Chrome和Internet Explorer。
下面是我使用的简单示例:

  1. <?php
  2. if (!isset($_SERVER['PHP_AUTH_USER'])) {
  3. header('WWW-Authenticate: Basic realm="Jonas Realm"');
  4. header('HTTP/1.0 401 Unauthorized');
  5. echo 'User pressed Cancel';
  6. exit;
  7. } else {
  8. echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
  9. echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as you password.</p>";
  10. }
  11. ?>

字符串
我如何在PHP中使用基本HTTP身份验证?

r1zk6ea1

r1zk6ea11#

试试这个:

  1. <?php
  2. /*
  3. ** Define a couple of functions for
  4. ** starting and ending an HTML document
  5. */
  6. function startPage()
  7. {
  8. print("<html>\n");
  9. print("<head>\n");
  10. print("<title>Listing 24-1</title>\n");
  11. print("</head>\n");
  12. print("<body>\n");
  13. }
  14. function endPage()
  15. {
  16. print("</body>\n");
  17. print("</html>\n");
  18. }
  19. /*
  20. ** test for username/password
  21. */
  22. if( ( isset($_SERVER['PHP_AUTH_USER'] ) && ( $_SERVER['PHP_AUTH_USER'] == "leon" ) ) AND
  23. ( isset($_SERVER['PHP_AUTH_PW'] ) && ( $_SERVER['PHP_AUTH_PW'] == "secret" )) )
  24. {
  25. startPage();
  26. print("You have logged in successfully!<br>\n");
  27. endPage();
  28. }
  29. else
  30. {
  31. //Send headers to cause a browser to request
  32. //username and password from user
  33. header("WWW-Authenticate: " .
  34. "Basic realm=\"Leon's Protected Area\"");
  35. header("HTTP/1.0 401 Unauthorized");
  36. //Show failure text, which browsers usually
  37. //show only after several failed attempts
  38. print("This page is protected by HTTP " .
  39. "Authentication.<br>\nUse <b>leon</b> " .
  40. "for the username, and <b>secret</b> " .
  41. "for the password.<br>\n");
  42. }
  43. ?>

字符串

展开查看全部
368yc8dk

368yc8dk2#

对于PHP-CGI:
在.htaccess中添加以下内容:

  1. <IfModule mod_rewrite.c>
  2. RewriteEngine on
  3. RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
  4. </IfModule>

字符串
然后在脚本的开头添加以下内容:

  1. list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));

xvw2m8pv

xvw2m8pv3#

PHP是如何运行的?如果是通过Apache mod_cgi,恐怕你根本无法获得身份验证信息。Apache不会将其传递给CGI应用程序,除非你用SECURITY_HOLE_PASS_AUTHORIZATION标志编译它。(这是否真的是一个安全漏洞取决于你服务器上的其他用户是否比你网站的用户拥有更低或更高的权限。)
如果是IIS CGI,则必须确保只配置了“匿名”目录访问,否则IIS将尝试介入并验证凭据本身。

  1. echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";

字符串
HTML注入安全漏洞(如果它能工作的话)。使用htmlspecialchars()。伙计,PHP文档页面充满了高度可疑的建议和代码。
你也可以尝试看看$_SERVER['HTTP_AUTHORIZATION'],虽然我怀疑这是mod_cgi的问题,在这种情况下,两个变量都不存在,你将不得不求助于基于cookie的登录,或者改变到一个更现代的PHP托管方法的主机,如FastCGI或mod_php。

np8igboo

np8igboo4#

我认为PHP方法依赖于Web服务器上配置的基本身份验证。一个简单的方法是在您想要启用基本身份验证的目录中包含一个.htaccess文件。
大多数基于unix的web主机允许你上传这个文件,一个单独的文件(称为.htauth)将保存允许访问站点或目录的用户登录。

sycxhyv7

sycxhyv75#

检查你是否在试图访问变量$_SERVER[‘PHP_AUTH_USER’]$_SERVER[‘PHP_AUTH_PW’]的地方之前覆盖了这两个变量。
如果以上不是这种情况,那么检查一下你是否使用php作为cgi mod。如果你使用php作为cgi mod,那么在大多数情况下,你不会得到$_SERVER[‘PHP_AUTH_USER’]$_SERVER[‘PHP_AUTH_PW’],因为一般来说,我们不会用SECURITY_HOLE_PASS_AUTHORIZATION选项编译apache。所以如果你想得到这两个变量,那么用SECURITY_HOLE_PASS_AUTHORIZATION选项重新编译apache,或者你可以使用.htaccess方法。

7vhp5slm

7vhp5slm6#

如果您的**$_SERVER变量中没有PHP_AUTH_USERPHP_AUTH_PW**,则需要检查PHP_AUTH_DIGEST,如下所述:https://www.php.net/manual/en/features.http-auth.php
检查示例#2。

相关问题