【问题标题】:PHP HTTP Authentication if conditional statementPHP HTTP Authentication if 条件语句
【发布时间】:2012-11-08 06:52:48
【问题描述】:
<?php
   if (!isset($_SERVER['PHP_AUTH_USER'])) {
      header('WWW-Authenticate: Basic realm="My Realm"');
      header('HTTP/1.0 401 Unauthorized');
      echo 'Text to send if user hits Cancel button';
      exit;
   } else {
      echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
      echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
   }
?> 

这段代码违背了“if”控制结构工作方式背后的逻辑。但是我在很多代码中都看到了同样的东西,所以出于某种原因它一定是正确的。然而我的逻辑告诉我并非如此。

当然"!isset($_SERVER['PHP_AUTH_USER'])) 的条件检查是否在服务器上设置了这个变量。假设它没有设置。因此,服务器向需要 HTTP 身份验证 "header('WWW-Authenticate: Basic realm="My Realm"');" 的客户端发送请求,假设我提供了一个正确的请求。在此之后,"if" 控制结构以某种方式跳过了" header('HTTP/1.0 401 Unauthorized');" 和 echo 语句以及控制结构的其余部分。这是为什么呢?

【问题讨论】:

  • 那一行不应该排在第一位吗?
  • 我不明白你在问什么。如果未设置变量,则执行一段代码。否则,另一个。您对此有什么不明白的地方?

标签: php http authentication


【解决方案1】:

脚本运行两次。

首先它进入第一个块,将标题和“如果用户点击取消按钮则发送文本”文本发送到浏览器,然后停止(参见exit)。 PHP 脚本完全终止,忘记了曾经发生过的任何事情。

控制权交给浏览器,您可以在其中输入密码。 (此时浏览器已经接收到取消按钮文本,但由于 401 状态标头而无法显示。)输入密码后,控件返回服务器并再次执行脚本 从顶部开始,现在(已发送密码)进入第二部分。

如果您改为按 Escape,浏览器会删除密码对话框,并仅显示它在第一次执行期间已收到的内容(取消按钮文本)。

您可以通过查看您的网络服务器的访问日志来遵循这一点。

【讨论】:

  • 嗯,有点像循环。因此,在第一个块中,第一个标头向浏览器发送一条指示正在使用“基本”身份验证,而第一个块中的第二个标头告诉浏览器提供的凭据不正确(或不存在)并且用户必须提供凭据。但是,即使提供了正确的,如何防止“if”语句跳过“echo”语句?
  • @robert 整个脚本一直运行到最后。在header 调用后它并没有停止(好吧,它是exits)。 PHP 是一种通过 HTTP 协议进行通信的服务器端语言。 HTTP 没有来回交互,一个完整的请求后面跟着一个完整的响应,这意味着 PHP 在执行过程中没有得到用户反馈。
  • 我在这里找到了我正在寻找的确切答案:stackoverflow.com/questions/8770885/php-authentication-beginner
  • 脚本运行两次是对的。因为浏览器在第二个标题“401 Unauthorized”之后使用新输入重新加载页面,因此使用新输入或无输入获取脚本,并在条件语句中再次对其进行验证。第二次如果它是正确的或设置它跳转到第二个块。如果用户在 HTTP Authenticate 中选择“取消”,则浏览器不会重新加载页面,并且脚本会回显“如果用户点击取消则打印出来的文本”
  • 我还发现 IBM 提供了这个非常有用的解释:publib.boulder.ibm.com/infocenter/cicsts/v3r1/…
猜你喜欢
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多