Как я могу использовать базовую аутентификацию HTTP в PHP?

Я пытаюсь использовать базовая аутентификация HTTP и последовал примеру на странице руководства 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?

5 ответов


как выполняется 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:

in .откройте файл. 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’] до места, где вы пытаетесь получить доступ к обеим переменным.

если выше не так, то чек, если вы используете 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 пост.