【问题标题】:HTTP authentication PHP and HTML formHTTP 认证 PHP 和 HTML 表单
【发布时间】:2016-09-22 03:01:18
【问题描述】:

早上好!我在使用 PHP 进行 HTTP 身份验证时遇到了一些问题。正如我在不同的帖子中发现的那样,在表单提交后,我尝试了这个 PHP 代码:

PHP

<?php 
$us = 'name';
$pswd = 'pass';
function verify($a, $b) { return ($a==$us && $b==$pswd);};
$user = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
if(!isset($user) || verify($user, $password)==false) {
    header('WWW-Authenticate: Basic realm="MyRealm"');
    header('HTTP/1.1 401 Unauthorized');
    exit;
}
else{
    echo 'Correctly authenticated';
}
?>

当我单击 HTML 中的提交按钮表单时,会出现一个弹出窗口,询问我(再次)用户名和密码。为什么?我认为在某些方面我必须使用输入中的值在 $_SERVER 中设置 PHP_AUTH_USER,但我不知道如何设置。
我认为当我从表格,因为我仍在使用 post 方法。我必须使用什么方法?

HTML

<br>
<form method="post" action="page.php">
   <input type="text" name="user">
   <input type="password" name="password">
   <input type="submit">
</form>
<br>

我以前从来没有做过,欢迎任何关于如何在服务器端检查数据或其他东西的提示!

【问题讨论】:

    标签: php html forms apache http


    【解决方案1】:

    问题在于您的 isset $user 您需要像此示例代码一样检查用户

    $user = $_SERVER['PHP_AUTH_USER'];
    $password = $_SERVER['PHP_AUTH_PW'];
    if(!isset($user)) {
      header('WWW-Authenticate: Basic realm="MyRealm"');
      header('HTTP/1.1 401 Unauthorized');
    }
    
    if(isset($user)) {
      $us = 'name';
      $pswd = 'pass';
      if($user == $us && $password == $pswd){
        echo 'Correctly authenticated';
      }else{
       header('WWW-Authenticate: Basic realm="MyRealm"');
       header('HTTP/1.1 401 Unauthorized');
      }
    }
    

    通过查看评论中提供的详细信息 -

    1) You can not set the html input field directly in your "Basic authentication"`
    2) Before the webpage load all the data basic authentication 
       comes in front of browser and webserver
    

    因此,您不能通过输入字段自动填充基本身份验证

    【讨论】:

    • 好吧,我按照您的建议更改了代码:它有效!我对此有一些疑问。我认为我在出现的弹出窗口中设置了 $_SERVER['PHP_AUTH_USER'] 。如何直接从我的 HTML 表单中执行此操作?例如,当我在大学的个人页面上登录时,就会发生这种情况。我可以从将 $_SERVER[etc] 设置为我传递给表单的值的 php 页面传递吗?谢谢!
    • 编辑:我不知道为什么,但关闭浏览器后它不再工作。我认为 $_SERVER['PHP_AUTH_USER') 已被删除,但我不确定。
    【解决方案2】:

    我认为您在进行基本身份验证时不需要 HTML 表单。

    只要依靠浏览器表单,就可以了。

    编辑

    我建议删除 WWW Authenticate 标头,并依靠您自己的身份验证过程(保留您的 HTML):

    <?php 
    $us = 'name';
    $pswd = 'pass';
    function verify($a, $b) { return ($a==$us && $b==$pswd);};
    $user = $_POST['user'];
    $password = $_POST['password'];
    if(!isset($user) || verify($user, $password)==false) {
      header('HTTP/1.1 401 Unauthorized');
      exit;
      // You also can redirect to the login page instead:
      // header("Location: myLoginPage.php");
    }
    else{
        echo 'Correctly authenticated';
    }
    

    另外请记住,您希望使用一些会话持久性,cookie 也可以工作。

    【讨论】:

    • 我也试过了,但即使写了'name'和'pass',它也会循环再次询问我的用户名和密码。我需要做一个简单的登录表单,就像我可以使用方法 post 一样,但使用 http。例如,当我登录我的大学页面时,我只需填写表格并提交,没有其他弹出窗口,它使用 HTTP(我认为是 HTTPS,但我不太确定)。我该怎么做?
    • 通过这种方式,我可以根据需要保留帖子中的数据。但是 HTTP 身份验证在哪里?我想说,我不从 PHP_AUTH_USER 获取数据,我认为这是从 HTTP 进行身份验证的方式。这样看来,这似乎是一种普通的形式身份验证。我错了吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多