Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/46: Рейтинг темы: голосов - 46, средняя оценка - 4.65
1 / 1 / 0
Регистрация: 10.10.2011
Сообщений: 15

Безопасная проверка сессии админа. (админка на php)

10.07.2012, 20:02. Показов 8585. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
О том как сделать вход в админку написан не мало. Думаю, начинающим пхпшникам будет не сложно найти простенькие алгоритмы авторизации, набрав в яндексе: "как сделать админку на php".
Но хотелось бы прояснить, (думаю это будет интересно не только мне) как правильно проверять в админских скриптах, что сессия принадлежит именно админу (чтобы никто кроме админа не смог воспользоваться админскими скриптами (с) КО).

А впрочем, попробуем без лишних вводных слов. Итак...
Дано:
1. форма входа
2. обычная таблица в базе данных ( id, login, password (конечно в md5) )
3. обработка входных данных (экранирование кавычек - защита от инъекций, стандартный запрос в базу для проверки пароля)
Действие:
Если пароли совпадают, то мы просто:
PHP
1
$_SESSION['id'] = $myrow['id'];
(где $myrow['id'] - это, конечно, id админа из базы, кстати равен единице)

Вопрос:
Какие достаточные условия для безопасного выполнения админского скрипта?
Варианты ответов:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*1*/
if ( isset($_SESSION['id']) ){
    //выполнение скрипта
}
/* ----------- */
/*2*/
if ( isset($_SESSION['id']) ){
    $id = intval( $_SESSION['id'] ); //паранойя?
    $result = mysql_query("SELECT id FROM admins WHERE BINARY password='$id'",$db);
    if ($result == true){
         //выполнение админского скрипта
    }
}
/* ----------- */
/*3*/
/* Ранее, когда проверяли правильность пароля:*/
$_SESSION['pass'] = $myrow['password'];
/* ---- */
if ( isset($_SESSION['pass']) ){
    $pass = htmlspecialchars($_SESSION['pass'], ENT_QUOTES); //паранойя? ну или stripslashes() Кстати, в чём разница?
    $result = mysql_query("SELECT id FROM admins WHERE BINARY password='$pass'",$db);
    if ($result == true){
         //выполнение админского скрипта
    }
}
/* ----------- */
/*4*/
/* Другое! Нужное указать/объяснить. */
Сессии это ведь куки, злоумышленник может их подделать как-нибудь? (Тем более если админский id = 1) Вселите уверенность в меня пожалуйста.

Вопрос 2:
Кстати, есть ещё один вопрос, про привилегии "админов", если их несколько. Какое существует тривиальное решение этой проблемы?
Может использовать ещё одно поле в таблице админов с указанием привилегии, и заводить ещё одну переменную сессии с привилегией, или просто булевую переменную, если привилегия есть?

p.s.
Правильно поставленный вопрос - это уже половина ответа.
Если всё хорошо, то может этот пост поможет ещё каким-нибудь сомневающимся...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.07.2012, 20:02
Ответы с готовыми решениями:

Проверка на админа в авторизационной сессии
А таблице юзеров есть поле prava. Если оно 1 то пользователь admin если 0 то не админ. Выбираем всех админов: $admis =...

Админка для блога, аутентификация админа
Здравствуйте, уважаемые гуру.) Потихоньку учу веб-программирование и появился следующий вопрос. Допустим, я разрабатываю блог и хочу,...

Проверка наличия шрифта в системе и установить если отсуствует + проверка запущен ли проект с правами админа
Здравствуйте. Как можно проверить наличия шрифта в системе и установить его если отсуствует. Ну плюс еще проверить запущен ли проект от...

7
 Аватар для c4boomb
198 / 166 / 23
Регистрация: 20.04.2011
Сообщений: 750
Записей в блоге: 1
10.07.2012, 21:33
маразм...

вотЪ
authadm.php
HTML5
1
2
3
4
5
6
7
<form method="POST" action="admin.php">
Login:<br/>
<input type="text" name="mlogin"/><br/>
Password:<br/>
<input type="pass" name="mpass"/><br/>
 
</form>
admin.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
session_start();
$sql=mysql_query("Select * from admin limit 1;");
$adminfo=mysql_fetch_assoc($sql);
if(isset($_SESSION["secadm"]))
{
    if($_SESSION["secadm"]=md5($adminfo["id"]."123456qwerty")
          {
                 /* Здесь страничка админа
                 */
           }
     else
          {
            header("location:authadm.php");
           }
    if(isset($_POST[""]))
    { 
     \\ Здесь логинимся.
 
     }
}
?>

Сессия шифруеться md5, с SALT поэтому если id = 1 то у хакера ничего не выйдет))
Писал наспех, поэтому логин не написал, спешу потом если надо допишу.
Скрипт на ошибки не проверял
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
10.07.2012, 21:55
почитайте про функцию mysql_real_escape_string(), она специально для "безопасных" запросов
0
1 / 1 / 0
Регистрация: 10.10.2011
Сообщений: 15
10.07.2012, 23:02  [ТС]
Цитата Сообщение от c4boomb Посмотреть сообщение
admin.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
session_start();
$sql=mysql_query("Select * from admin limit 1;");
$adminfo=mysql_fetch_assoc($sql);
if(isset($_SESSION["secadm"]))
{
    if($_SESSION["secadm"]=md5($adminfo["id"]."123456qwerty")
          {
                 /* Здесь страничка админа
                 */
           }
     else
          {
            header("location:authadm.php");
           }
    if(isset($_POST[""]))
    { 
     \\ Здесь логинимся.
 
     }
}
?>
Не очень понял откуда взяться if(isset($_SESSION["secadm"]))
Может как-то так?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
session_start();
$sql=mysql_query("Select * from admin limit 1;");
$adminfo=mysql_fetch_assoc($sql);
if(isset($_SESSION["secadm"]))
{
    if($_SESSION["secadm"]=md5($adminfo["id"]."123456qwerty")
          {
                 /* Здесь страничка админа
                 */
           }
     else
          {
            header("location:authadm.php");
           }
}
if(isset($_POST[""]))
{ 
     /* если только один админ, то запрос к базе делать уже не надо...
     Короче, если пароли совпадают то: */
          $_SESSION["secadm"]=md5($adminfo["id"]."123456qwerty");
}
Я правильно понял?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
10.07.2012, 23:32
Цитата Сообщение от mavmedved Посмотреть сообщение
паранойя? ну или stripslashes() Кстати, в чём разница?
оО htmlspecialchars()/htmlentities() преобразуют символы в их сущности, т.е. < станет &lt; , > станет &gt; и т.п.
а stripslashes() убирает экранирование символов - т.е.:
вместо \' будет просто ' , вместо \" будет просто ", вместо \\ будет просто \

Добавлено через 4 минуты
Цитата Сообщение от mavmedved Посмотреть сообщение
PHP
1
if($_SESSION["secadm"]=md5($adminfo["id"]."123456qwerty")
это условие всегда будет выполняться в php = это присваивание, сравнение - это два равно == (есть еще с тремя равно, "эквивалентное" - т.е. дополнительно по типу переменных)
0
1 / 1 / 0
Регистрация: 10.10.2011
Сообщений: 15
10.07.2012, 23:40  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
оО htmlspecialchars()/htmlentities() преобразуют символы в их сущности, т.е. < станет &lt; , > станет &gt; и т.п.
а stripslashes() убирает экранирование символов - т.е.:
вместо \' будет просто ' , вместо \" будет просто ", вместо \\ будет просто \
Да, да... извиняюсь, перепутал с addslashes.
Просто, например для написания комментариев, надо пользователю запрещать вводить html теги, а заодно и кавычки экранировать. Просто получается без разницы как защититься от инъекции, или при помощи экрнирование addslashes, или при помощи преобразования кавычек htmlspecialchars (в режиме ENT_QUOTES преобразуются и двойные, и одиночные кавычки в html сущности, это вполне защитит, и правильно выведет комментарий)
извиняюсь за некорректно поставленный вопрос.

Добавлено через 1 минуту
Цитата Сообщение от KOPOJI Посмотреть сообщение
это условие всегда будет выполняться в php = это присваивание, сравнение - это два равно == (есть еще с тремя равно, "эквивалентное" - т.е. дополнительно по типу переменных)
Да, это просто копипаст
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
10.07.2012, 23:44
Цитата Сообщение от mavmedved Посмотреть сообщение
в режиме ENT_QUOTES преобразуются и двойные, и одиночные кавычки в html сущности, это вполне защитит
ну ну..
http://www.securityscripts.ru/... tring.html
это я про вашу addslashes

Добавлено через 1 минуту
совмещайте несколько для защиты
1
1 / 1 / 0
Регистрация: 10.10.2011
Сообщений: 15
10.07.2012, 23:44  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
почитайте про функцию mysql_real_escape_string(), она специально для "безопасных" запросов
Кстати говоря, мне вот что интересно...
Написано, что mysql_real_escape_string() не экранирует символы % и _.
А если пользователь даст что-то такое "%27union+select" или "%27union%20select", не знаю как правильно. Всё ли будет нормально?

Впрочем не важно... Чувствую что чушь написал...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.07.2012, 23:44
Помогаю со студенческими работами здесь

Безопасная работа с init.php
Здравствуйте. Мне нужно отредактировать файл init.php. При этом доступа по ftp у меня нет. Как-то пытался отредактировать и сайт...

PHP сессии, сортировка массива сессии
Доброе время суток, существует такая ситуация, у меня есть корзина, которая основана на сессиях, всё работает хорошо, кроме одного,...

Простая админка на php
Приветствую! Может кто помочь: Есть файл, скажем config.php, в нем переменные. Помогите сделать для этого конфига админку...

простейшая админка php
Добрый день. Имеется файл config.php, хочу сделать для него простую админку, чтоб через форму передавать в него значения. Например,...

Проверка в бд на админа
Здравствуйте, вопрос в этом: у меня есть запрос к бд &lt;?php $connection = mysqli_connect('localhost','root','','bd'); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru