Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2017, 16:23   #1
Bulat Ibrahim
Форумчанин
 
Регистрация: 24.04.2015
Сообщений: 199
По умолчанию Проверка авторизации пользователя

Здравствуйте. Посмотрите пожалуйста, правильно ли я сделал проверку авторизации пользователя на административную чать сайта.
Запросы делаю с помощью AJAX (все запросы в БД с параметрами только там), поэтому проверку поставил там же, на файле AJAX.

Вот код авторизации индексной страницы (я использую единую точку входа):
Код:
switch($_SERVER["REQUEST_URI"]){
... ... ...
... ... ...
case "/administrator/":
	$titleIsem = "Редактирование сайта"; // Это вставится в <title> страницы
	$UBNav = "<li><a href='/' target='_self' title='Перейти на главную страницу'>Главная</a></li><li>Редактирование сайта</li>"; // Это хлебные крошки
	$topContent = "<form action='/administrator.php' method='POST' name='moharrirKeru' id='moharrirKeru'><input required type='text' name='keruIseme' id='keruIseme' placeholder='Логин' maxlength='40'><input required type='password' name='sersuz' id='sersuz' placeholder='Пароль' maxlength='40'><input type='submit' value='Войти' name='moharrirKeruToima' id='moharrirKeruToima'></form>";
	break;
Вот код файла administrator.php - один файл со всеми настройками сайта:
Код:
if ($_POST[keruIseme] == "(тут логин)" && $_POST[sersuz] == "(тут пароль)") { // сделал так, потому что редактировать будет только один человек, пароль и логин будет только один; просил на этом форуме - сказали, так безопасно
	session_start();
	$_SESSION['ADMINISTRATOR'] = $_POST[keruIseme]; // создаю сессию для проверки в AJAX-файле
	echo $adminContent; // Выше задам эту переменную, там будет вся страница
}
else {
	echo "<p style='text-align:center; margin:50px;'>Логин или пароль введены не верно. <br><a href='/administrator/' target='_self'>Назад.</a></p>";
}
И вот проверка AJAX-файла:
Код:
if(isset($_SESSION['ADMINISTRATOR'])){  // это и есть моя проверка
	// тут код Аякса
} else {
	header('Location: /');
}
Правильно я сделал проверку? Так безопасно?
Булат Азат улы
Bulat Ibrahim вне форума Ответить с цитированием
Старый 05.09.2017, 19:11   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Правильно я сделал проверку? Так безопасно?
Цитата:
Сообщение от Bulat Ibrahim Посмотреть сообщение
$_SESSION['ADMINISTRATOR'] = $_POST[keruIseme]; // создаю сессию для проверки в AJAX-файле
Отсутствует проверка вводных параметров. Угроза УБИ.025 с потенциалом на УБИ.016

Цитата:
Сообщение от Bulat Ibrahim Посмотреть сообщение
if ($_POST[keruIseme] == "(тут логин)" && $_POST[sersuz] == "(тут пароль)") { // сделал так, потому что редактировать будет только один человек, пароль и логин будет только один; просил на этом форуме - сказали, так безопасно
Угроза УБИ.30 а также уязвимость перехвату трафика. Злоумышленник может перехватить трафик там пароль передаётся в открытом виде.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 05.09.2017, 20:15   #3
Bulat Ibrahim
Форумчанин
 
Регистрация: 24.04.2015
Сообщений: 199
По умолчанию

Pavia, проверку пароля изменил, поставив md5:
Код:
if ($_POST['keruIseme'] == "Логин" && md5($_POST['sersuz']) == "32-значный код") {}
Так правильно?

Вы написали, что нет проверки при создании сессии - я же сессию создаю уже после проверки, которую написал выше? Или я что-то не понимаю? Если я "далёк от истины", не могли бы отправить меня на какой-то сайт, где об этом написано понятным языком, для начинающих? А то сам не смог найти нормальный сайт.
Булат Азат улы
Bulat Ibrahim вне форума Ответить с цитированием
Старый 05.09.2017, 20:25   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

В вашем случае - даже просто обновление страницы по f5 заставит аас вводить пароль заново.
В основном файле надо сначала проверять сессию и только если ее нет начинать проверять а не хочет ли кто авторизоваться... так как пользователь один и жестко прописан, смысла хранить в сесси егоимя не вижу. Просто храните true или 1
ADSoft вне форума Ответить с цитированием
Старый 05.09.2017, 21:13   #5
Bulat Ibrahim
Форумчанин
 
Регистрация: 24.04.2015
Сообщений: 199
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
... Просто храните true или 1
Я тоже думал, что бы там хранить. Сессия-то мне нужна только для проверки авторизации. Ладно, переименую в "1".

Цитата:
Сообщение от ADSoft Посмотреть сообщение
В основном файле надо сначала проверять сессию и только если ее нет начинать проверять а не хочет ли кто авторизоваться
Как-то в голову не приходят такие мысли. Сделал вот так:
Индексная страница (единая точка входа, сам сайт находится тут):
Код:
switch($_SERVER["REQUEST_URI"]){
... ... ...
// тут все ссылки обычного сайта
... ... ...
case "/administrator/":
	if (isset($_SESSION['ADMINISTRATOR'])){  // Проверяю, не авторизован ли пользователь; если авторизован - направляется на страницу редактирования сайта
		header('Location: /administrator.php');
	} else {  // если не авторизован, выводится форма входа
	$titleIsem = "Редактирование сайта"; // <title>
	$UBNav = "<li><a href='/' target='_self' title='Перейти на главную страницу'>Главная</a></li><li>Редактирование сайта</li>"; // хлебные крошки
	$topContent = "<form action='/administrator.php' method='POST' name='moharrirKeru' id='moharrirKeru'><input required type='text' name='keruIseme' id='keruIseme' placeholder='Логин' maxlength='40'><input required type='password' name='sersuz' id='sersuz' placeholder='Пароль' maxlength='40'><input type='submit' value='Войти' name='moharrirKeruToima' id='moharrirKeruToima'></form>";
	}
	break;
default:
	$titleIsem = "Такой страницы не существует";
	$UBNav = "<li>Такой страницы не существует</li>";
	$topContent = "<h1>Ошибка 404: Такой страницы не существует.</h1><p style='text-align:center;'>Проверьте правильность адреса в адресной строке.</p>";
	$UBOskaP = "<p class='urtaBitOskaP'><a class='urtaBitOska' href='/' target='_self' title='Перейти на главную страницу'>Главная</a></p>";
	break;
}
Файл administrator.php:
Код:
<?php
$moharrirContent = "<html><head></head><body></body></html>";

if (isset($_POST['moharrirKeruToima'])){ // если нажата кнопка "Войти"
	if($_POST['keruIseme'] == "Логин" && md5($_POST['sersuz']) == "32-значный код"){
		session_start();
		$_SESSION['ADMINISTRATOR'] = 1;
		echo $moharrirContent; // вывод данных редактирования сайта
	}
	exit();  // думаю, если это не поставлю, то условие ниже тоже выполнится, чего не надо
}

if (isset($_SESSION['ADMINISTRATOR'])){ // если уже есть сессия
	echo $moharrirContent; // вывод данных редактирования сайта
}
?>
Файл AJAX:
Код:
if(isset($_SESSION['ADMINISTRATOR'])){
	// тут код Аякса
} else {
	exit();
}
Правильно?
Булат Азат улы

Последний раз редактировалось Bulat Ibrahim; 05.09.2017 в 21:20.
Bulat Ibrahim вне форума Ответить с цитированием
Старый 05.09.2017, 21:42   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Bulat Ibrahim
Как это по мягче сказать. md5 является слабым хэшем. Он уязвим к "брутфорсу". Радужные таблицы и сайты декодирования-хэшей позволяютвскрыть пароль за считанные секунды.
Поэтому рекомендуется применять хэши с солью. Стоит вам это доделывать или нет решать вам - я бы отложил на потом.

Предполагаю что ещё необходима защита от DDoS на уровне единой точке входа. Но я абсолютно не в курсе как это сделать. Как пример сдешний форум с таймаутом на поиск в течении 20 секунд.
Цитата:
Сообщение от Bulat Ibrahim Посмотреть сообщение
Правильно?
А в остальном у меня притензий нет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 05.09.2017, 23:27   #7
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

Ну блин какая безопасность, какой мд5? Если человек простейшую авторизацию не может на сессиях сделать?
Что вы к мд5 прицепились? Как вы этот хеш получите то? Только если вам в руки попадет исходник файла! Хеши используют для того, чтоб слив бд пользователей с паролями не был так фатален. Тут по сути нет пользователей и паролей хранимых в бд.
По поводу кода.. я вижу чтотнет понимания логики авторизации и плюс технические недочеты.
Например сессию стартовать нужно в самом начале, а не внтри проверки лог пасса...
И вообще - вы проверяете потом работоспособность того что написали? Или сразу сюда?
ADSoft вне форума Ответить с цитированием
Старый 06.09.2017, 09:12   #8
Bulat Ibrahim
Форумчанин
 
Регистрация: 24.04.2015
Сообщений: 199
По умолчанию

Pavia, спасибо!
ADSoft, авторизация на сессиях мне и не нужна, поэтому, и не стремился сделать полноценные сессии. Я только в этом форуме узнал, что нужно сделать проверку в AJAX-файлы, где есть запросы. Не знал бы - сделал бы вообще без сессий.
Цитата:
Например сессию стартовать нужно в самом начале
Прямо в самом-самом? А то до этих условий у меня ничего нет. Просто подумал, чтобы не стартовать сессии зря (если данные авторизации не верны или файл сессии уже есть на сервере). Ладно, если нужно в самом начале, сделаю там. Спасибо, буду знать и далее.
Конечно, свой код проверяю. Только вот проверку существования сессии (в AJAX-файле) не проверил, так как я пока сам контент пишу в отдельной HTML-странице, в удобочитаемом виде. А потом уже перенесу на переменную "$moharrirContent" в файле administrator.php. Поэтому, условие проверки сессии в файле AJAX у меня закомментирована.
Не могли бы сказать вкратце, какие недочёты есть в коде? Что делаю не правильно?
Булат Азат улы
Bulat Ibrahim вне форума Ответить с цитированием
Старый 06.09.2017, 09:41   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Bulat Ibrahim Посмотреть сообщение
Я только в этом форуме узнал, что нужно сделать проверку в AJAX-файлы
Надо было еще узнать, что в мире HTTP не существует "AJAX-файлов" и прочих "файлов", это просто так в РНР исторически сложилось, что по умолчанию веб-сервер интерпретирует РНР при запросе к определенному РНР файлу (и в него заодно еще можно запихнуть HTML), а так в других языках и фреймворках (в том числе и для РНР) обычно есть отдельный (явно прописанный) роутинг, обработчики запросов/контроллеры и т.п.


Цитата:
Сообщение от Bulat Ibrahim Посмотреть сообщение
Прямо в самом-самом?
session_start() не будет работать после вывода, отправки заголовков и т.п., поэтому да. Обычно это делают в каком-нибудь bootstrap.php, который инклудится во всех точках входа в начале.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 06.09.2017, 10:10   #10
Bulat Ibrahim
Форумчанин
 
Регистрация: 24.04.2015
Сообщений: 199
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
в других языках и фреймворках (в том числе и для РНР) обычно есть отдельный (явно прописанный) роутинг, обработчики запросов/контроллеры и т.п.
С этим я немножко знаком. И в видео-курсах по созданию сайтов, которые я изучал, автор отдельно создавал файл моделей, контроллера и видов (папка со всеми стилями, скриптами), и соединял их вместе. Но он делал большой сайт (интернет-магазин с пользователями, каталогом товаров, с возможностью смены внешнего вида). А этот мой сайт очень маленький, поэтому я не стал тут так заморачиваться, сделал так, как понимаю лучше.
То, что в HTML нет PHP и AJAX я тоже знаю. Они просто добавляют на нужное место HTML-код и передают на сервер. Но для меня-то они, как файлы, есть
То, что до session_start() не должно быть вывода текста, я знаю.
Булат Азат улы
Bulat Ibrahim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение только авторизации пользователя artemavd PHP 0 08.08.2017 12:39
Расставление элементов авторизации и регистрации пользователя lexflax PHP 5 06.04.2014 18:57
лог авторизации пользователя volanddd PHP 4 28.06.2013 11:06
Cоздание авторизации пользователя Olga89 БД в Delphi 22 29.12.2012 05:00
Созранение авторизации пользователя _PROGRAMM_ PHP 5 12.01.2010 10:22