Здравствуйте мастера. Пишу портфолио, изучая php. Написал регистрацию такого типа: PHP: <?php require '../conf/config.php'; require '../conf/style.php'; require '../conf/head.php'; if (isset($_COOKIE['login'])) { header('Location: ../index.php'); } $q = $db -> query("SELECT `sekret_kode` FROM admin LIMIT 1"); $sekret_kode = $q -> fetch_row(); if (isset($_POST['sekret_kode'])) { if (intval($_POST['sekret_kode']) == intval($sekret_kode[0])) { $_SESSION['kode'] = ''; } } if (isset($_SESSION['kode'], $_POST['login'], $_POST['password'])) { $admin_data = $db -> query("SELECT `login`, `pass` FROM `admin` WHERE 1"); $admin = $admin_data -> fetch_assoc(); $login = trim($_POST['login']); $password = md5(md5($_POST['password'])); if ($admin['login'] == $login AND $admin['pass'] == $password) { $cockie = setcookie('login', $admin['login'], time()+3600*24*7, '/'); if ($cockie) header('Location: ../index.php'); else echo 'error1'; } else echo 'ererer00010101010'; } ?> <div class="maint"> <a class="cbut" href="cab.php"><i class="fa fa-users"></i> Вход в аккаунт админа</a> </div> <?php if (isset($_SESSION['kode'])): ?> <div class="activ"> <form method="POST" action="cab.php"> Логин:<br> <input type="text" name="login"><br> Пароль:<br> <input type="password" name="password"><br> <input type="submit" value="ВХОД"> </form> </div> <?php else: ?> <div class="activ"> <form method="POST" action="cab.php"> Секретный код:<br> <input type="text" name="sekret_kode"><br> <input type="submit" value="ВХОД"> </form> </div> <?php endif; ?> <?php require '../conf/foot.php'; ?> Тут сначала нужно в форму ввести секретный код, чтобы "пустило" к вводу пароля и логина. При правильном вводе пары логин:пароль создаются куки. И теперь, где мне нужен просмотр только для администрации, я проверяю так: if (isset($_COOKIE['login'])) это правильно так, или это небезопасно, а нужно ещё как-то по другому думать? Заранее спасибо за ответы)
Любой сможет создать cookie с именем login, так что не безопасно. Создавай сессию, а не cookie, сессию может создать только твой скрипт.
Ни в коем случае. Куки видно в браузере. Их можно украсть. Даже когда авторизацию делают без сессий, только на куках (видел такой вариант), в куку кладут только флаг "пользователь авторизирован" и id пользователя. --- Добавлено --- Но я предпочитаю через сессии
Я далеко на профи в отношении безопасности, но то что это одна из худших идей - точно. Даже в сессии хранить данные для авторизации нельзя, а в куках и подавно.
Не то, чтобы нельзя, бесполезно Но оттуда их никак не забрать, кроме как каким-нибудь шелом, но если уже шел залили - там вообще всё что угодно сделать можно. Много раз тебе уже написали - записываешь в сессию id пользователя. PHP: session_start(); if (!isset($_SESSION["user_id"])) { /* Чувак не авторизирован, посылаем авторизироваться */ } /* Чувак авторизирован. Получаем по id его данные и делаем, что нам надо */
На этом форуме используется движок XenForo, который идентифицирует пользователя по куке. (Как и почти все остальные форумы). Самый распостраненный в интернетах сайтовый движок WordPress тоже использует специальную куку, а не читает айди из сессии. Не надо бояться. Надо делать правильно: хранить id пользователя в куке можно, но дополнительно надо хранить некий хеш/подпись/назови_хрень_как_угодно, по которой ты сумеешь проверить что эта кука не поддельная.
это например, можно сгенерировать текст, например, на 20 символов. Поместить его в куки и потом проверять на соответствие тому что я генерировал, и тому что находится в куках? Но а куда записать его для сравнения, в сессию мб? Или с базы брать какое-то поле, и переводить его в md5, к примеру?
Возможны разные варианты. И случайное значение, которое сохраняется в таблицу, и хеш от пароля+соль. Про сессионные значения важно знать что они недолго живут. По умолчанию — до закрытия окна браузера. Соответственно если ты собираешся дать пользователю логиниться с опцией [x] Запомнить меня то полюбому тебе понадобится долгоживущая кука. Никогда не пытайся объявить саму сессию долгоживущей: это противоречит самой идее сессии и ты только словишь новые проблемы.
P.S. XenForo создаёт аутентификационную куку с именем xf_session, что какбы намекает на сессию. Время жизни этой куки — до закрытия браузера. Подробности реализации я не изучал. Знаю только, что если пользователь отметил галочкой "Запомнить меня", то дополнительно создаётся ещё одна кука с именем xf_user и в ней ID пользователя + какой-то хеш. Если xf_session удалить, а xf_user оставить, то форум не забудет тебя, а восстановит идентификацию, опираясь на данные из xf_user. То есть мы имеем некую комбинацию подходов.