Задать вопрос
WebThinker
@WebThinker
Жизнь слишком коротка, чтобы ее просто про срать.

Почему http аутентификация возвращает форму авторизации?

Помогигите пожалуйста, почему не проходит аутентификация.
После ввода пары, лог и пасс, форма делает повторный запрос и так бесконечно, не пропускает дальше.
В лог ошибок, Apache не ругается.
Сервер домашний, смотрит в интернет. Apache2 4.25 работает в связке с NGiNX, PHP 7.0.3, MySQL 10.1.23-MariaDB, версия клиента базы данных: libmysql - mysqlnd 5.0.12.
Сервер работает по протоколу HTTPS.
<?php include("mysql.php");
if (!isset($_SERVER['PHP_AUTH_USER']))
{
	header("WWW-Authenticate: Basic realm=\"Admin Page\"");
    header("HTTP/1.0 401 Unauthorized");
	echo "Текст, отправляемый в том случае, если пользователь нажал кнопку Cancel";
	exit();
}
else {
    if (!get_magic_quotes_gpc())
    {
    $login = $mydb->real_escape_string($_SERVER['PHP_AUTH_USER']);
    $password = $mydb->real_escape_string($_SERVER['PHP_AUTH_PW']);
	}
    $query = "SELECT pass FROM users WHERE login='$login'";
    $lst = @$mydb->query($query);
    if (!$lst)
    {
        header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        header ("HTTP/1.0 401 Unauthorized");
        exit();
	}
    if ($lst->num_rows == 0){
        header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        header ("HTTP/1.0 401 Unauthorized");
        exit();
	}
    $pass = @$lst->fetch_array(MYSQLI_BOTH);
    if ($password != $pass['pass']){
        header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        header ("HTTP/1.0 401 Unauthorized");
        exit();
	}
}
?>

Вот содержимое файла mysql.php
<?php
$mydb=new mysqli('localhost', 'UserBD', '123BD123', 'DBtest');
/* check connection */
if ($mydb->connect_errno) {
    printf("Connect failed: %s\n", $mydb->connect_error);
    exit();
}
$mydb->query('SET NAMES utf8');
?>
  • Вопрос задан
  • 150 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
  1. @ перед $mydb->query($query) уберите, чтобы ошибки запроса если что показывались.
  2. $password = $mydb->real_escape_string($_SERVER['PHP_AUTH_PW']);
    в этом нет необходимости и возможно принесёт ошибки, т.к. вы получаете пароль (в открытом виде, кстати, храните? не надо так) в исходном виде, и стоит сравнивать именно с тем, что передал пользователь.
    if ($password !== $pass['pass']){
  3. Переходите на PDO и параметризованные запросы. Меньше проблем, больше безопасность.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы