管理员用户名/密码不适用于PHP

时间:2013-11-25 22:00:19

标签: php authentication admin

所以我目前正在学习PHP编程课程,最后我开始学习认证和授权。

因此,在本书中,我们首先限制了授予您可以更新和删除所有帐户的所有帐户的访问权限的页面。我们从定义常量开始:

define('VALID_USERNAME', '');
define('VALID_PASSWORD', '');

为了方便自己,我只是将它们作为空字符串。

一切顺利,要求输入用户名和密码的对话框弹出。 但是,当我把空字符串放入时,对话框会一直弹出,好像密码错误,或者根本就没有输入密码。即使我用真实字符串定义用户名和密码,也会发生这种情况。

以下是该部分的代码:

if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) {
    header('http/1.1 401 Unauthorized');
    header('WWW-Authenticate: Basic realm="Wonder Penguin"');
} else {
    if (($_SERVER['PHP_AUTH_USER'] != VALID_USERNAME) ||
        ($_SERVER['PHP_AUTH_PW'] != VALID_PASSWORD)) {
        header('http/1.1 401 Unauthorized');
        header('WWW-Authenticate: Basic realm="Wonder Penguin"');
    }
}

如果您想知道为什么我没有使用exit()函数来阻止人们点击取消来绕过身份验证并进入更新页面。我这样做了,所以我的老师可以评分我创建最后一个作业的页面。

我已经厌倦了排除故障:

我测试过是否使用echo函数正确定义了有效的用户名和密码。

echo VALID_USERNAME;
echo VALID_PASSWORD;

它突然出现了我的定义。所以从理论上讲,我认为我的定义是正确的。

我尝试用单引号,双引号和无引号编写define函数。 这本书要我写这样的函数:

define(VALID_USERNAME, "admin");
define(VALID_PASSWORD, "password");

然而,当我尝试在那里定义它时,这会产生一个错误,我正在使用一个未定义的常量。

var_dump($_SERVER);结果:

array(37) {

["REDIRECT_HANDLER"]=> string(23) "application/x-httpd-php"
["REDIRECT_STATUS"]=> string(3) "200"
["HTTP_HOST"]=> string(20) "patti-bee2.dcccd.edu"
["HTTP_CONNECTION"]=> string(10) "keep-alive"
["HTTP_ACCEPT"]=> string(74) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
["HTTP_USER_AGENT"]=> string(108) "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36"
["HTTP_ACCEPT_ENCODING"]=> string(17) "gzip,deflate,sdch"
["HTTP_ACCEPT_LANGUAGE"]=> string(14) "en-US,en;q=0.8"
["HTTP_COOKIE"]=> string(217) "__qca=P0-630369357-1378011844686; __utma=198331962.264424896.1377179965.1382812794.1384740700.12; __utmc=198331962; __utmz=198331962.1381981575.8.4.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided)"
["PATH"]=> string(135) "C:\Program Files (x86)\PHP\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;c:\php;"
["SystemRoot"]=> string(10) "C:\Windows"
["COMSPEC"]=> string(27) "C:\Windows\system32\cmd.exe"
["PATHEXT"]=> string(53) ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC"
["WINDIR"]=> string(10) "C:\Windows"
["SERVER_SIGNATURE"]=> string(0) ""
["SERVER_SOFTWARE"]=> string(21) "Apache/2.2.22 (Win32)"
["SERVER_NAME"]=> string(20) "patti-bee2.dcccd.edu"
["SERVER_ADDR"]=> string(14) "144.162.99.193"
["SERVER_PORT"]=> string(2) "80"
["REMOTE_ADDR"]=> string(11) "99.7.247.36"
["DOCUMENT_ROOT"]=> string(66) "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs"
["SERVER_ADMIN"]=> string(16) "pburks@dcccd.edu"
["SCRIPT_FILENAME"]=> string(106) "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\Coleman\Wonder Penguin\PHP\show_all.php"
["REMOTE_PORT"]=> string(5) "54619"
["REDIRECT_URL"]=> string(40) "/coleman/wonder penguin/php/show_all.php"
["GATEWAY_INTERFACE"]=> string(7) "CGI/1.1"
["SERVER_PROTOCOL"]=> string(8) "HTTP/1.1"
["REQUEST_METHOD"]=> string(3) "GET"
["QUERY_STRING"]=> string(0) ""
["REQUEST_URI"]=> string(42) "/coleman/wonder%20penguin/php/show_all.php"
["SCRIPT_NAME"]=> string(40) "/coleman/wonder penguin/php/show_all.php"
["ORIG_SCRIPT_FILENAME"]=> string(18) "C:/PHP/php-cgi.exe"
["ORIG_PATH_INFO"]=> string(40) "/coleman/wonder penguin/php/show_all.php"
["ORIG_PATH_TRANSLATED"]=> string(106) "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\Coleman\Wonder Penguin\PHP\show_all.php"
["ORIG_SCRIPT_NAME"]=> string(16) "/php/php-cgi.exe"
["PHP_SELF"]=> string(40) "/coleman/wonder penguin/php/show_all.php"
["REQUEST_TIME"]=> int(1385432192)
}

此时我已经将它直接从书中复制出来了。 我做错了什么?

如果你想亲自尝试一下,这里是link to my site

7 个答案:

答案 0 :(得分:0)

使用以下代码获得最佳结果,例如

define(VALID_USERNAME,“admin”); define(VALID_PASSWORD,“password”);

if(($ _SERVER ['PHP_AUTH_USER']!= VALID_USERNAME)||     ($ _SERVER ['PHP_AUTH_PW']!= VALID_PASSWORD)){

header('WWW-Authenticate: Basic realm="Wonder Penguin"');
header('HTTP/1.0 401 Unauthorized');

出口;     }

答案 1 :(得分:0)

试试这个

define('VALID_USERNAME', '');
define('VALID_PASSWORD', '');

if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']))
{
    header('http/1.1 401 Unauthorized');
    header('WWW-Authenticate: Basic realm="Wonder Penguin"');
    echo "Fail";
}
else
{
    if (($_SERVER['PHP_AUTH_USER'] != VALID_USERNAME) ||
        ($_SERVER['PHP_AUTH_PW'] != VALID_PASSWORD))
    {
        header('http/1.1 401 Unauthorized');
        header('WWW-Authenticate: Basic realm="Wonder Penguin"');
        echo "Fail";
    }
    else
    {
        echo "SUccess";
    }
}

答案 2 :(得分:0)

这种全局变量用户名和登录状态是存储在会话中所以我们可以全局,我更喜欢存储在会话中而不是将其定义为常量

答案 3 :(得分:0)

我知道我没有专家或善于解释清楚的事情,但据我所知,问题在于如何使用基本身份验证以及在何处放置基本身份验证的标题(对我来说只是不要&#39这是多余的。):

这是一个可以帮助您使用基本身份验证的代码:

包含用户名和密码等凭据。我不建议使用define()来达到安全目的。

if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW']))
{
   $valid_user = 'admin';
   $valid_password = 'password';
   if($_SERVER['PHP_AUTH_USER'] == $valid_user && $_SERVER['PHP_AUTH_PW'] == $valid_password)
   {
      $response = array('Response'  => true,
                        'Message'   => 'Welcome! ' . $valid_user);

      $result = json_encode($response);
      echo $result;
   }
   else
   {
      $response = array('Response'  => false,
                        'Message'   => 'User and Password does not match!');

      $result = json_encode($response);
      echo $result;
      exit();
   }
}
else
{
   header('WWW-Authenticate: Basic realm="Wonder Penguin"');
   header('HTTP/1.0 401 Unauthorized');

   $response = array('Response' => false,
                     'Message'  => '401 Unauthorized!');

   $result = json_encode($response);
   echo $result;
   exit();
}

这就是全部,享受学习!

答案 4 :(得分:0)

从php5.6开始,您可以在编译时使用 const 。这意味着您不能在运行时按照定义的方式在内部条件中分配它们。

const VALID_USERNAME = "admin";      // global
const VALID_PASSWORD = "password";   // global

class CREDENTIALS {
    const VALID_USERNAME = "admin";     // not global
    const VALID_PASSWORD = "password";  // not global
}


echo CREDENTIALS::VALID_USERNAME;  // "admin"
echo CREDENTIALS::VALID_PASSWORD;  // "password"

if(!defined("VALID_USERNAME")){
    echo "the constant VALID_USERNAME is not defined";
}


if(isset($_SERVER['SOMETHING'])){
   const VALID_USERNAME = "admin";     // won't work
   const VALID_PASSWORD = "password";  // won't work
}

if(isset($_SERVER['SOMETHING'])){
   define("VALID_USERNAME","admin");     //  works
   define("VALID_PASSWORD","password");  // works
}

  1. 创建常量时,必须为其分配一个值。
  2. 常量只能用常量值初始化,而不能用表达式初始化。
  3. const 可用于创建全局常量。此类常量是在全局范围内定义的,可以在脚本中的任意位置访问
  4. const 可以在类或接口中使用以定义类常量或接口常量。
  5. 类常量的引用方式与静态属性相同
  6. 定义不能用于此目的。

或者如果您要创建数组

class CREDENTIALS {
    const ARR = [
        VALID_USERNAME => "admin",
        VALID_PASSWORD => "password"
    ]
}

echo CREDENTIALS::ARR['VALID_USERNAME']; // "admin",
echo CREDENTIALS::ARR['VALID_PASSWORD']; // "password"

自php7起,您现在还可以定义常量作为数组

define(ARR, [
 "VALID_USERNAME" => "admin",
 "VALID_PASSWORD" => "password"
]);

echo ARR["VALID_USERNAME"]; // "admin"
echo ARR["VALID_PASSWORD"]; // "password"

如果使用命名空间,则 const 始终在当前命名空间中定义常量,而使用 define 时,您必须始终使用完整的命名空间名称

namespace SOME\NAME\SPACE;

    const VALID_USERNAME = "admin";
    const VALID_PASSWORD = "password";

    define("SOME\NAME\SPACE\VALID_USERNAME", "admin");
    define("SOME\NAME\SPACE\VALID_PASSWORD", "password");

答案 5 :(得分:-1)

也许是因为你正在使用OR。你说如果用户名无效或密码无效,则显示401.尝试将其设为&&代替?这样他们就必须拥有确切的用户名和密码。

if (($_SERVER['PHP_AUTH_USER'] != VALID_USERNAME) ||
    ($_SERVER['PHP_AUTH_PW'] != VALID_PASSWORD)) {
header('http/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Wonder Penguin"');
    }

答案 6 :(得分:-2)

这很简单: 如果您以编程方式设置用户名和密码,请尝试此操作(如果使用登录页面!)

<?php
$username = $_POST['username'];
$password = $_POST['password'];
$cu = "admin";
$cpw = "password";
if($username = $cu && $password = $cpw){
//Code to be executed
}else{
if condition is false
}
?>