Я пытаюсь использовать Basic HTTP Authentication и следовать примеру на странице руководства PHP. Но это не работает для меня. Переменная $_SERVER['PHP_AUTH_USER']
, похоже, не установлена. Когда пользователь пытается войти в систему, пользователю предлагается ввести новый диалог входа в систему. На сервере работает PHP 5.3.3, и я попытался с Google Chrome и Internet Explorer.
Вот простой пример, который я использовал:
<?php if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate: Basic realm="Jonas Realm"'); header('HTTP/1.0 401 Unauthorized'); echo 'User pressed Cancel'; exit; } else { echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>"; echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as you password.</p>"; } ?>
Что не так? Как я могу использовать базовую HTTP-аутентификацию в PHP?
Как работает PHP? Если это происходит через Apache mod_cgi, я боюсь, что вы не сможете получить информацию об аутентификации. Apache не передаст его в приложения CGI, если вы не скомпилируете его с флагом SECURITY_HOLE_PASS_AUTHORIZATION
. (Независимо от того, действительно ли это дыра в системе безопасности или нет, зависит от того, имеют ли другие пользователи на вашем сервере более низкую или большую привилегию, чем пользователи вашего сайта.)
Если это IIS CGI, вы должны убедиться, что настроен только доступ к «анонимному» каталогу, или IIS попытается выполнить вход и аутентификацию самих учетных данных.
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
Ядро защиты от инъекций в HTML (хорошо, если оно сработало). Используйте htmlspecialchars()
. Человек, это страница PHP doc, полная очень сомнительных советов и кода.
Вы можете попытаться посмотреть и на $_SERVER['HTTP_AUTHORIZATION']
, хотя я подозреваю, что это проблема mod_cgi, и в этом случае ни одна из переменных не будет присутствовать, и вам придется прибегать к имени на основе файлов cookie. Или перейдите на хост с более современным подходом к хостингу PHP, например FastCGI или mod_php.
Для PHP-CGI:
в .htaccess добавить это:
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] </IfModule>
и в начале вашего скрипта добавьте следующее:
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
Попробуй это::
<?php /* ** Define a couple of functions for ** starting and ending an HTML document */ function startPage() { print("<html>\n"); print("<head>\n"); print("<title>Listing 24-1</title>\n"); print("</head>\n"); print("<body>\n"); } function endPage() { print("</body>\n"); print("</html>\n"); } /* ** test for username/password */ if( ( isset($_SERVER['PHP_AUTH_USER'] ) && ( $_SERVER['PHP_AUTH_USER'] == "leon" ) ) AND ( isset($_SERVER['PHP_AUTH_PW'] ) && ( $_SERVER['PHP_AUTH_PW'] == "secret" )) ) { startPage(); print("You have logged in successfully!<br>\n"); endPage(); } else { //Send headers to cause a browser to request //username and password from user header("WWW-Authenticate: " . "Basic realm=\"Leon's Protected Area\""); header("HTTP/1.0 401 Unauthorized"); //Show failure text, which browsers usually //show only after several failed attempts print("This page is protected by HTTP " . "Authentication.<br>\nUse <b>leon</b> " . "for the username, and <b>secret</b> " . "for the password.<br>\n"); } ?>
Я думаю, что методы PHP полагаются на базовую аутентификацию, настроенную на веб-сервере. Легкий способ сделать это – включить файл .htaccess в каталог, для которого вы хотите включить базовую аутентификацию.
Большинство веб-узлов, основанных на UNIX, позволяют вам просто загружать этот файл. Отдельный файл (вызов этого .htauth) будет содержать пользовательские логины, которым разрешен доступ к сайту или каталогу.
Убедитесь, что вы переопределили переменную $_SERVER['PHP_AUTH_USER']
и $_SERVER['PHP_AUTH_PW']
перед тем местом, где вы пытаетесь получить доступ к обеим переменным.
Если выше не так, тогда используйте chek, если вы используете php как cgi mod или нет. Если вы используете php как cgi mod, тогда в большинстве случаев вы не получите $_SERVER['PHP_AUTH_USER']
и $_SERVER['PHP_AUTH_PW']
потому что в общем случае мы не скомпилируем apache с опцией SECURITY_HOLE_PASS_AUTHORIZATION
Итак, если вы хотите получить обе переменные, а затем повторно скомпилируют apache с опцией SECURITY_HOLE_PASS_AUTHORIZATION или вы можете использовать подход .htaccess, описанный в основной записи PHP PHP .