9

Я пытаюсь использовать Basic HTTP Authentication и следовал примеру на странице руководства PHP. Но это не работает для меня. Переменная $_SERVER['PHP_AUTH_USER'], похоже, не установлена. Когда пользователь пытается войти в систему, пользователю предлагается ввести новый диалог входа в систему. На сервере работает PHP 5.3.3, и я попытался с Google Chrome и Internet Explorer.Как я могу использовать базовую HTTP-аутентификацию в PHP?

Вот простой пример, который я использовал:

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

+0

Вместо того, чтобы пытаться сделать это с помощью PHP, почему бы вам не использовать веб-сервер, например http://httpd.apache.org/docs/2.2/howto/auth.html – Phil

+1

@James: Я думаю, что моя сеть хост использует Apache. – Jonas

+1

@Phil: Тогда мой PHP-код будет лишен моего веб-сервера, и я не могу перейти на другой веб-сервер. Я хотел бы следовать стандарту HTTP. – Jonas

ответ

8

Как работает 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.

0

Я думаю, что методы PHP основаны на базовой аутентификации, настроенной на веб-сервере. Легкий способ сделать это - включить файл .htaccess в каталог, для которого вы хотите включить базовую аутентификацию.

Большинство веб-хостов на основе unix позволяют вам просто загружать этот файл. Отдельный файл (вызов этого .htauth) будет содержать пользовательские логины, которым разрешен доступ к сайту или каталогу.

+1

Это неверно. PHP может полностью контролировать заголовки, отправленные клиенту (браузеру). – Phil

+0

@phil не соответствует действительности. Apache всегда отправляет заголовок «Сервер:», и PHP не может этого предотвратить. –

4

Попробуйте ::

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

Для 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))); 
+0

Этот 'substr()' является подозрительным. Сначала я должен сломать строку в первом пространстве и убедиться, что тип аутентификации действительно установлен в «Basic» (игнорируя регистр). Затем получите вторую часть и расшифруйте ее. –

0

Проверьте, не были ли вы переопределены r variable $_SERVER[‘PHP_AUTH_USER’] и $_SERVER[‘PHP_AUTH_PW’] перед тем местом, где вы пытаетесь получить доступ к обеим переменным.

Если выше не так, то chek, если вы используете php как cgi mod или нет. ЕСЛИ вы используете php как cgi mod, тогда в большинстве случаев вы не получите $_SERVER[‘PHP_AUTH_USER’] и $_SERVER[‘PHP_AUTH_PW’], потому что generraly мы не скомпилируем apache с опцией SECURITY_HOLE_PASS_AUTHORIZATION Итак, если вы хотите получить обе переменные, то перекомпилируйте apache с опцией SECURITY_HOLE_PASS_AUTHORIZATION или вы можете использовать подход .htaccess, описанный в сообщении PHP basic auth.

Смежные вопросы