Создать ответ 
Вход в админку по логину и паролю
Автор Сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #1
Вход в админку по логину и паролю
Здравствуйте, решил создать новую тему, думаю для многих будет актуальна.

Имеется страница admin.php которая лежит в корне, в данный момент если обращаться напрямую по адресу site.ru/admin.php, страница появляется, т.е. защиты нет никакой.

Что сделал, чтобы защитить страницу...
1. В базе создал таблицу "userlist", где обзор
[Изображение: tid_396_lock.png]
и структура
[Изображение: tid_396_structure.png]

2. Создал файл lock.php, где код
PHP код:
<?php
include $_SERVER['DOCUMENT_ROOT']."/php/db.php";
if (!isset(
$_SERVER['PHP_AUTH_USER']))

{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}

else {
if (!
get_magic_quotes_gpc()) {
$_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
$_SERVER['PHP_AUTH_PW'] = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
}

$query "SELECT pass FROM userlist WHERE user='".$_SERVER['PHP_AUTH_USER']."'";
$lst = @mysql_query($query);

if (!
$lst)
{
Header ("WWW-Authenticate: Basic realm=\"Admin\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}

if (
mysql_num_rows($lst) == 0)
{
Header ("WWW-Authenticate: Basic realm=\"Admin\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}

$pass = @mysql_fetch_array($lst);
if (
$_SERVER['PHP_AUTH_PW']!= $pass['pass'])
{
Header ("WWW-Authenticate: Basic realm=\"Admin\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
}
?>

3. В файле admin.php, который находится в корне, прописал подключение к lock.php
PHP код:
<?php
include $_SERVER['DOCUMENT_ROOT']."/php/lock.php";

// - - - код админки - - - //

?>

4. Результат:
Все вроде правильно, но где-то есть косяк Scratch, при обращении теперь к админке, _http://site.ru/admin.php, появляется окно

[Изображение: tid_396_review.png]

но если я ввожу данные user и pass согласно mysql таблицы "userlist" (user, 12345) у меня ничего не происходит, т.е. если логин и пароль введены верно должна появится страница admin.php, что у меня не выполняется...

Гляньте, где косяк, что неправильно в коде, в с таблицой все в порядке и в самом коде файла lock.php как правильно mysql на mysqli поменять?
Заранее благодарен Yes
05.11.2016 17:45:57
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #2
RE: Вход в админку по логину и паролю
Все прекрасно работает. Возможно, проблема в том, что Вы подключаетесь к mysqli, а в коде используете mysql.

Код файл lock.php немного уменьшил (без потери функционала), и заменил mysql на mysqli:
PHP код:
<?php
function out() {
 
Header("WWW-Authenticate: Basic realm=\"Admin\"");
 
Header("HTTP/1.0 401 Unauthorized");
 exit();
}

include 
$_SERVER['DOCUMENT_ROOT']."/php/db.php";

if (!isset(
$_SERVER['PHP_AUTH_USER'])) out();
else {
 if (!
get_magic_quotes_gpc()) {
 
$_SERVER['PHP_AUTH_USER'] = mysqli_real_escape_string($db,$_SERVER['PHP_AUTH_USER']);
 
$_SERVER['PHP_AUTH_PW'] = mysqli_real_escape_string($db,$_SERVER['PHP_AUTH_PW']);
 }

 
$lst = @mysqli_query($db,"SELECT pass FROM userlist WHERE user='".$_SERVER['PHP_AUTH_USER']."'");
 if (!
$lstout();
 if (
mysqli_num_rows($lst) == 0out();

 
$pass = @mysqli_fetch_array($lst);
 if (
$_SERVER['PHP_AUTH_PW'] != $pass['pass']) out();
}
?>

Еще не рекомендуется в БД пароли хранить в открытом виде. Лучше хранить md5 хеш паролей. Таким образом, в случае если кто-то получит доступ к БД, он не получит пароли.

P.S. А тема и вправду для многих будет полезна.
07.11.2016 15:29:17
Найти все сообщения Цитировать это сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #3
RE: Вход в админку по логину и паролю
Цитата:проблема в том, что Вы подключаетесь к mysqli, а в коде используете mysql

Совершенно, верно Ok. Как говорится, поспешишь, людей насмешишь...Smile

1. Согласен с вами, хранить лучше в md5, т.е сейчас так:
[Изображение: tid_396_admin.png]

2. Вопрос, если данные в окне ввожу в зашифрованном md5 виде, то все OK. Попадаю на страницу админки, все как положено, а хотел бы вводить данные обычные, т.е. в таком раскладе мне нужно будет создавать в базе дополнительное поле md5 и вытаскивать оттуда данные пароля и логина или как-то проще можно

Строчка:
Цитата:$lst = @mysqli_query($db,"SELECT pass FROM admin WHERE user='".$_SERVER['PHP_AUTH_USER']."'");
будет:
Цитата:$lst = @mysqli_query($db,"SELECT pass FROM admin WHERE md5='".$_POST['id']."'");

т.е. нужно при обращении к странице admin.php вводить данные не в зашифрованном виде, а в обычном, а базе они будут храниться в md5, думаю так будет правильно.

3. И еще вопрос, как обнулять кэш, т.е если я ввел данные верно, появилась страница admin.php - все нормально, но если я ее закрываю и повторно к ней обращаюсь, то она открывается сразу, если я обнуляю кэш Ctrl+F5 то в этом случае поле для ввода пароля появляется.
Как понимаю, браузер запоминает на какое-то время введенные данные, даже, например, в Mozilla когда появляется окно предлагая сохранить пароль, я отказываюсь, но при обращении к админке повторно страница открывается сразу без запроса пароля.

Заранее благодарен.Yes
07.11.2016 18:14:55
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #4
RE: Вход в админку по логину и паролю
1. Хранить md5 хеш нужно только для пароля.
2. Пользователь вводит логин и пароль, далее сервер вычисляет md5 хеш введенного пароля и сравнивает его с полученным хешем из БД.
Т.е. достаточно только добавить вычисление md5 в строчку:
PHP код:
if (md5($_SERVER['PHP_AUTH_PW']) != $pass['pass']) out(); 

3. Скорее всего, пока сессия не закончится, пароль спрашивать не будет. Как вариант, можно добавить кнопку выход, при нажатии на которую будет отправлен POST запрос, после чего обнулить переменную $_SERVER['PHP_AUTH_PW'].
07.11.2016 21:51:26
Найти все сообщения Цитировать это сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #5
RE: Вход в админку по логину и паролю
Цитата:Т.е. достаточно только добавить вычисление md5 в строчку:
PHP код:
if (md5($_SERVER['PHP_AUTH_PW']) != $pass['pass']) out(); 

Что-то у меня данный код не срабатывает, сейчас в базе так
[Изображение: tid_396_md5.png]

т.е. логин оставляю как есть, а пароль в md5, при добавлении кода для вычисления md5, ничего не происходит, данные пароля и логина сбрасываются.
Если попробовать пароль ввести в md5? то все нормально, а при добавленной строчке не работает Scratch
Может двойные кавычки тут нужны?

Цитата:Скорее всего, пока сессия не закончится, пароль спрашивать не будет. Как вариант, можно добавить кнопку выход, при нажатии на которую будет отправлен POST запрос, после чего обнулить переменную $_SERVER['PHP_AUTH_PW'].

Подскажите как правильно добавить кнопку выхода, чтобы кэш наверняка обнулялся, прописать в самой админке и куда адресовать на главную страницу?

Благодарен за помощь Yes
07.11.2016 23:21:06
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #6
RE: Вход в админку по логину и паролю
Все прекрасно работает.

Например, у пользователя логин user пароль 12345. Тогда в БД мы храним логин user и пароль 827ccb0eea8a706c4c34a16891f84e7b (это md5 хеш пароля 12345).

При входе на сайт пользователь вводит логин user и пароль 12345. Далее мы ищем в БД логин user и соответствующий ему пароль (md5 хеш). Далее вычисляем md5 хеш от введенного пароля и сравниваем его с md5 хешем, полученным из БД.

Вероятно, занесенный в БД md5 хеш не соответствует тому паролю, что Вы вводите.


По поводу принудительного выхода.
В файл lock.php после function out() { . . . } добавьте:
Код:
if (isset($_POST["del_auth"])) {
    unset($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']);
    out();
}

А внизу файла lock.php после if (md5($_SERVER['PHP_AUTH_PW']) != $pass['pass']) out(); добавьте:
PHP код:
echo '<form method="POST" action=""><input type="submit" name="del_auth" value="Выход"></form>'
08.11.2016 13:15:56
Найти все сообщения Цитировать это сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #7
RE: Вход в админку по логину и паролю
Здравствуйте, не работает ...
Проверил несколько раз, даже менял кодировку файла

1.
Код:
<?php
function out() {
Header("WWW-Authenticate: Basic realm=\"Admin\"");
Header("HTTP/1.0 401 Unauthorized");
exit();
}

if (isset($_POST["del_auth"])) {
    unset($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']);
    out();
}

include $_SERVER['DOCUMENT_ROOT']."/php/database.php";

if (!isset($_SERVER['PHP_AUTH_USER'])) out();
else {
if (!get_magic_quotes_gpc()) {
$_SERVER['PHP_AUTH_USER'] = mysqli_real_escape_string($db,$_SERVER['PHP_AUTH_USER']);
$_SERVER['PHP_AUTH_PW'] = mysqli_real_escape_string($db,$_SERVER['PHP_AUTH_PW']);
}

$lst = @mysqli_query($db,"SELECT pass FROM admin WHERE user='".$_SERVER['PHP_AUTH_USER']."'");
if (!$lst) out();
if (mysqli_num_rows($lst) == 0) out();

$pass = @mysqli_fetch_array($lst);
if ($_SERVER['PHP_AUTH_PW'] != $pass['pass']) out();

if (md5($_SERVER['PHP_AUTH_PW']) != $pass['pass']) out();
echo '<form method="POST" action=""><input type="submit" name="del_auth" value="Выход"></form>';
}
?>

если убираю строчку
Код:
if (md5($_SERVER['PHP_AUTH_PW']) != $pass['pass']) out();
и ввожу в виде md5 ff8b1ed2fb2b3e5bcd505f22e94d0498 (ale10ey), т.е вожу логин как есть и пароль в виде md5, то все нормально, а если вводить обычный пароль то все сбрасывается и поля пустые...Scratch
Уже несколько раз проверил тоже самое...

2. Временно закомментировал строчку
Код:
if (md5($_SERVER['PHP_AUTH_PW']) != $pass['pass']) out();
чтобы войти в админку, чтобы посмотреть на кнопку выхода.

Кнопка есть, но выдается ошибка:
Цитата:Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at D:\Site\OpenServer\domains\site.ru\www\php\lock.php:30) in D:\Site\OpenServer\domains\site.ru\www\admin.php on line 31
где 31 строчка
Код:
if (session_id()=='') session_start();

У вас работает, а у меня нет, даже не понимаю, где собака зарыта Scratch

P.S.: на всякий случай сделал еще скриншот базы
[Изображение: tid_396_md5_2.png]

Поправка к коду файла lock.php
Последние строчки кода без скобки
Код:
if (md5($_SERVER['PHP_AUTH_PW']) != $pass['pass']) out();
echo '<form method="POST" action=""><input type="submit" name="del_auth" value="Выход"></form>';
?>
(Последний раз сообщение было отредактировано 08.11.2016 в 17:42:45, отредактировал пользователь ale10ey.)
08.11.2016 17:32:07
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,279
У нас с: Aug 2011
Сообщение: #8
RE: Вход в админку по логину и паролю
Что-то меня смущают Ваши фразы:
Цитата:если убираю строчку
Код:
if (md5($_SERVER['PHP_AUTH_PW']) != $pass['pass']) out();

. . .

2. Временно закомментировал строчку
Код:
if (md5($_SERVER['PHP_AUTH_PW']) != $pass['pass']) out();

А Вы случаем не обе строки оставили? Должна быть только с md5!
Ранее было так:
PHP код:
if ($_SERVER['PHP_AUTH_PW'] != $pass['pass']) out(); 

потом должно стать так:
PHP код:
if (md5($_SERVER['PHP_AUTH_PW']) != $pass['pass']) out(); 

Если оставить обе строчки, то одна из них будет не срабатывать, и как следствие, авторизации не будет.

2. Ошибка стандартная.
Либо в admin.php перенесите строчку if (session_id()=='') session_start(); выше (до подключения файла lock.php), либо перенесите код кнопки в файл admin.php после if (session_id()=='') session_start();.

И если планируется закрыть только админку и доступ сделать только для админа, то по-моему гораздо проще воспользоваться .htpasswd.
08.11.2016 18:14:51
Найти все сообщения Цитировать это сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #9
RE: Вход в админку по логину и паролю
Нашел проблему, почему при "правильном" наборе логина и пароля все сбрасывалось.

1. Часть кода :
Код:
<?php
function out() {
Header("WWW-Authenticate: Basic realm=\"Admin\"");
Header("HTTP/1.0 401 Unauthorized");
exit();
}

/*
if (isset($_POST["del_auth"])) {
     unset($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']);
     out();
}
*/
так вот, если данный кусок раскомментировать, то все работает нормально и данные пароля ввожу, как и логин, т.е получается именно эта строчка и сбрасывала все время введенные данные.

В плане ошибки я уже разобрался, тут все ясно, почему она возникала, но это все я экспериментировал без кода в lock.php после function out() {...}
Код:
if (isset($_POST["del_auth"])) {
     unset($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']);
     out();
}
почему то данный код вызывает сброс полей Scratch

2.
Цитата:И если планируется закрыть только админку и доступ сделать только для админа, то по-моему гораздо проще воспользоваться .htpasswd.
т.е вы имеете ввиду создать файл с паролями .htpasswd, а в файле htaccess прописать к нему путь...
Как лучше сделать ?
Заранее благодарен.
08.11.2016 19:31:44
Найти все сообщения Цитировать это сообщение
ale10ey Не на форуме
Генерал-майор
*

Сообщений: 311
У нас с: Nov 2014
Сообщение: #10
RE: Вход в админку по логину и паролю
Цитата:И если планируется закрыть только админку и доступ сделать только для админа, то по-моему гораздо проще воспользоваться .htpasswd

Здравствуйте, ознакомился я с .htpasswd.

1. С помощью утилиты htpasswd.exe создал файл .htpasswd, который как и файл админки (admin.php) находится в корне сайта, где кстати также и .htaccess

2. Далее в .htaccess прописываю запрет на изменение файла .htpasswd
Код:
<Files .htpasswd>
   deny from all
</Files>

3. Далее прописываю .htaccess строчки, на запрет админки
Код:
#AuthType Basic  
#AuthName "Only for administrator !"
#AuthUserFile  /site.ru/admin.php/.htpasswd  
#require group ale10ey
где в 3 строчке я не уверен, так как выдается ошибка
Цитата:Authentication required!

This server could not verify that you are authorized to access the URL "/". You either supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.

In case you are allowed to request the document, please check your user-id and password and try again.
есть окно, я ввожу данные, снова сообщение
Цитата:The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there was an error in a CGI script.

короче, где-то имеется косяк Scratch

4. У меня сейчас как понимаю все распространяется на все, что находится в корне, на всю директорию, а мне нужно защитить только файл админки, который как и файл .htpasswd и .htaccess лежит в корне.

5. Сайт еще в разработке и тестируется на локальном сервере, думаю с этим все в порядке, а где косяк пока понять не могу...
09.11.2016 01:03:47
Найти все сообщения Цитировать это сообщение
Создать ответ 


Переход:


Пользователи просматривают эту тему: 1 Гость(ей)



Mail.ru LiveInternet

© Copyright 2011-2016 by UsefulScript.ru