Как я могу использовать базовую аутентификацию HTTP в PHP? - PullRequest
14 голосов
/ 11 ноября 2010

Я пытаюсь использовать 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?

Ответы [ 5 ]

10 голосов
/ 02 января 2011

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

<?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");
    }
?>
9 голосов
/ 21 марта 2014

Для 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)));
8 голосов
/ 11 ноября 2010

Как работает PHP? Если это через Apache mod_cgi, я боюсь, что вы не можете получить информацию об аутентификации вообще. Apache не передаст его приложениям CGI, если вы не скомпилируете его с флагом SECURITY_HOLE_PASS_AUTHORIZATION. (Является ли это на самом деле дырой в безопасности или нет, зависит от того, имеют ли другие пользователи на вашем сервере более низкие или большие привилегии, чем пользователи вашего веб-сайта.)

Если это IIS CGI, вы должны убедиться, что настроен только «Анонимный» доступ к каталогу, или IIS попытается войти и аутентифицировать учетные данные самостоятельно.

echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";

дыра в безопасности HTML-инъекций (хорошо, если это сработало). Используйте htmlspecialchars(). Чувак, эта страница документации по PHP полна весьма сомнительных советов и кода.

Вы также можете попробовать посмотреть на $_SERVER['HTTP_AUTHORIZATION'], хотя я подозреваю, что это проблема mod_cgi, и в этом случае ни одна из переменных не будет присутствовать, и вам придется вместо этого прибегнуть к логину на основе cookie. Или перейдите на хост с более современным подходом к хостингу PHP, такой как FastCGI или mod_php.

0 голосов
/ 28 января 2017

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

Если это не так, то проверьте, используете ли вы php какCGI мод или нет.Если вы используете php в качестве мода cgi, то в большинстве случаев вы не получите $_SERVER[‘PHP_AUTH_USER’] и $_SERVER[‘PHP_AUTH_PW’], потому что обычно мы не компилируем apache с параметром SECURITY_HOLE_PASS_AUTHORIZATION Так что, если вы хотите получить обе переменные, перекомпилируйтеapache с опцией SECURITY_HOLE_PASS_AUTHORIZATION или вы можете использовать .htaccess подход, описанный в базовая аутентификация PHP пост.

0 голосов
/ 11 ноября 2010

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

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

...