Admin имя пользователя / пароль не работает для PHP

Поэтому я в настоящее время занимаюсь курсом по программированию на 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 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) } 

На данный момент я почти полностью скопировал это из книги. Что я делаю не так?

Если вы хотите попробовать сами, вот ссылка на мой сайт .

Используйте следующий код для получения наилучшего результата, например

define (VALID_USERNAME, «admin»); define (VALID_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'); 

Выход; }

Попробуй это

 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"; } } 

это имя глобального имени переменной и журнал. В статусе хранится в сеансе, поэтому мы можем вам глобально, я предпочитаю хранить в сеансе, а не определять это как константы

Я знаю, что я не эксперт и не хорошо разбираюсь в вещах, но насколько я знаю, проблема заключается в том, как использовать базовую аутентификацию и где разместить заголовки базовой аутентификации (для меня просто не ставьте ее избыточно). :

Вот код, который может помочь вам играть с базовой аутентификацией:

В том числе учетные данные, такие как usernam и пароль. Я не предлагаю использовать 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(); } 

Вот и все и наслаждайтесь изучением!

возможно, потому, что вы ищете, используя 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"'); } 

Это просто: если вы произвольно задаете имя пользователя и пароль, попробуйте это (при использовании страницы входа!).

 <?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 } ?>