用户点击“取消”时显示未授权的页面(html / php)

时间:2012-01-09 10:00:44

标签: php html

我最近开始学习HTML和PHP。如果有人能指出我正确的方向,我会很感激:我已经制作了一个基本的网页,其中包含基本的身份验证(输入它)。当用户点击取消按钮时,我希望浏览器做点什么!它所做的就是,保留在它所在的页面上(在用户尝试访问我的页面之前)。我想我希望它显示401错误。是这样做的唯一方法,在以下后插入文本:

header('www-authenticate: basic');

我已经尝试重定向.htaccess文件中的401错误,虽然看起来401错误永远不会发生(尽管服务器访问日志表明存在401错误)。当我使用.htaccess重定向我的404错误时,它工作正常。

这是我用于身份验证的代码:

<?php
$user = array('Michael' => 'Mike');
$pass = array('Michael' => 'fish');
$userSuccess = false;
$passSuccess = false;

if(!isset($_SERVER['PHP_AUTH_USER']) && !isset($_SERVER['PHP_AUTH_PW']))
{
    header('http/1.1 401 Unauthorized');
    header('www-authenticate: basic');
    exit;
}
else
{
    foreach($user as $value)
        if($_SERVER['PHP_AUTH_USER'] == $value)
            $userSuccess = true;
    foreach($pass as $value)
        if($_SERVER['PHP_AUTH_PW'] == $value)
            $passSuccess = true;

    if(!$userSuccess || !$passSuccess)
    {
        header('http/1.1 401 Unauthorized');
        header('www-authenticate: basic');
        exit;
    }
}
?>

另外,如果我在代码中做了任何愚蠢的事情,请随意指出。

我认为自从我将401标头发送到服务器,并且服务器已经收到它后,它会显示一些文字说'错误401:未经授权的访问'或者其他类似的内容。

感谢。

2 个答案:

答案 0 :(得分:1)

您需要使用401的内容为浏览器提供服务。这不是自动完成的。您发送的401标头从未真正被用户看到。将其视为状态标志而不是内容。程序使用该标题来检测某些问题并对其进行操作(即下载管理器可以检测404标题,然后在其窗口中显示带有红色背景和错误符号的下载行。)

总之,您需要自己将错误打印到浏览器

答案 1 :(得分:1)

你走的是正确的方式。我会对您的代码进行一些更改:

$user = array('Mike' => array('Michael', 'fish'));

if(!isset($_SERVER['PHP_AUTH_USER']) && !isset($_SERVER['PHP_AUTH_PW']))
{
    header('http/1.1 401 Unauthorized');
    header('www-authenticate: basic');
    exit;
}
else
{
    $input_user = $_SERVER['PHP_AUTH_USER'];
    $input_pw = $_SERVER['PHP_AUTH_PW'];

    if($user[$input_user][1] != $input_pw)
    {
        header('http/1.1 401 Unauthorized');
        header('www-authenticate: basic');
        exit;
    }
}

echo "Hi, " . $user[$input_user][0];

首先,我已将此布局上的users数组布局更改为:

Array
(
    [Mike] => Array
        (
            [0] => Michael
            [1] => fish
        )

)

阅读更多信息Multidimensional Arrays

Secund,是您的username,然后它会有另一个用户namepassword的数组。因此,您无需使用foreach来匹配您的用户名并通过。顺便说一句,你在脚本允许任何用户访问其他用户之前所采用的方式是通过的。如果您有其他用户foo并尝试user = foopass = fish,则会获得访问权限。

第三件事是你不需要再使用$userSuccess$passSuccess。只是为了减少代码长度。

然后我将两个变量与_SERVER变量相关联,以方便它们的使用。所以你可以用这句话来匹配:$user[$input_user][1] != $input_pw

我希望这可以帮助你。