PHP身份验证(初学者)


PHP Authentication (beginner)

我最近开始学习PHP。我制作了一个基本的网站,并想基本上对其进行密码设置。如果有人能告诉我为什么这不起作用,我将不胜感激。我知道它不起作用,因为我试过了;我就是不明白为什么。

<?php
$user='user';
$pass='pass';
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm='.'hello');
if($_SERVER['PHP_AUTH_USER']==$user && $_SERVER['PHP_AUTH_PW']==$pass)
    echo 'Authorized';
else
    exit('Exiting');
?>
...
REST OF WEBSITE
...

我知道做这件事的"正确"方法是这样的:

<?php
if(!isset($_SERVER['PHP_AUTH_USER']))
{
     header('HTTP/1.1 401 Unauthorized');
     header('WWW-Authenticate: Basic realm='.'hello');
     exit('Exiting');
}
else
{
    $user='user';
    $pass='pass';
    if($_SERVER['PHP_AUTH_USER']==$user && $_SERVER['PHP_AUTH_PW']==$pass)
        echo 'Authorized';
    else
    {
        header('HTTP/1.1 401 Unauthorized');
        header('WWW-Authenticate: Basic realm='.'hello');
        exit('Exiting');
    }
}
?>
REST OF WEBSITE

如果有人至少能给我指明正确的方向,我将不胜感激。

使用HTTP身份验证时,脚本会运行两次:第一次,$_SERVER['PHP_AUTH_USER']未设置,您必须告诉浏览器页面需要身份验证。然后浏览器重新加载页面,尽管这次$_SERVER['PHP_AUTH_USER']包含用户名,$_SERVER['PHP_AUTH_PW']包含用户提供的密码。如果这与正确的凭据($user$pass)匹配,则可以继续将页面发送到浏览器。

您的代码不会区分这两种情况,因此它会告诉浏览器它需要用户名和密码,即使已经发送了正确的凭据。

使用此行:

header('HTTP/1.1 401 Unauthorized');

将通知浏览器请求失败。当您将它用于每个请求时,每个请求都会失败。

这就是为什么在第二个例子中,它并不总是被执行,而只是有条件地执行。

我创建了一个小的演示示例。您的浏览器登录框将显示,您可以输入任何您喜欢的内容,如果您想阻止再显示登录框,请按取消。

然后,您将看到哪些数据被提供给了PHP脚本。