Доброго времени суток! Нет ли чего-нибудь потенциально опасного (вплане уязвимостей) в следующем коде для авторизации: Код (Text): if (@$_COOKIE['password']) { $_COOKIE['password'] == PASSWORD_HERE ? $admin = 1 : $admin = 0; } else $admin = 0; ?> Т.е. пароль хранится в кукисах. И дальше, по коду, в зависимости от значения переменной $admin что-то совершается. Конечно, можно хранить в кукисах не сам пароль, а его хэш, но, я так понимаю, это не существенно.
сославшись на php-файл например так: login.php?admin=1 можно присвоить переменной значение 1 чем это обернётся, думаю не нужно говорить. лучше делать проверку на "админство" каждый раз где это нужно, а не работать с переменной. да и хеш хранить будет всё же лучше
RamMerLabs > сославшись на php-файл например так: login.php?admin=1 Да ничем это не обернётся. $admin и $_GET['admin'] - это совершенно разные вещи. Так что без знания пароля тут никак не обойтись. Не так ли?
keYMax Тык что плохого в том, что пароль хранится в кукисах? Я же выхожу только с одной машины (своей) в эту админку.
поищи в интернете книги A. A. Орлов - PHP полезные приемы (глава 8) - нормально написано про все способы авторизации доступа... и М. Фленов - PHP Глазами Хакера...
Если включено register_globals то присвоить значение переменной можно до инициализации через кукисы либо get-запрос, но у тебя стоит else, поэтому, по идее, не сработает. По моему так лучше: Код (Text): $admin = 0; if (isset($_COOKIE['password'])) $_COOKIE['password'] == PASSWORD_HERE ? $admin = 1 : $admin = 0; ?>
juicy_emad Кукисы воруются и под ними может зайти злой дядька. Сессии действуют 20 минут по умолчанию с момента последнего обращения, даже если будет кем-то слит идентификатор сессии, злодей сможет под ним зайти только в течении этого времени, что очень маловероятно. К тому же через PHP там удобно хранить всякие переменные между страницами, для админки в самый раз. Естественно при каждом начале работы с админкой надо вводить один раз логин и пасс. Да собственно как правильно написали выше в любой книге по PHP есть все примеры.
juicy_emad Если брать общие правила "хорошего тона", то в кукисах должен храниится ИД сессии, и все переменные сессии и т.д. храняться на стороне сервера. Плохо в том, что в нормальных системах для смены пароля (и мыла для восстановления) какого-либо аккаунта нужно подтверждение старым паролем, и в случае перехвата кукисов, например путем XSS злоумышленник только перехватит сессию, а с паролем в кукисах он еще и уведет аккаунт. Еще как вероятно, вы к примеру заходя на форум не логинитесь каждый раз?
keYMax, для админки вообще проще HTTP-авторизацию апачем сделать и всё. А для юзеров хватает хеша пароля в куках. Сессии многим не нравятся как раз тем, что истекают в самый неподходящий момент.
iZzz32 Этим "немногим" стоит выпрямить руки... Код (Text): session_save_path("./data/sessions"); session_start(); setcookie("PHPSESSID", session_id(), 1893456000);
Вот кстати, как я недавно делал авторизацию в одной админке... Планирую еще немного модифицировать (ввести salt в функцию хеширования)... Этот кодес в начале всего скрипта админки: Код (Text): if (isset($_POST["actn"])) { $action = $_POST["actn"]; } else { $action = ""; } if (isset($_POST["p0"])) { $p_0 = $_POST["p0"]; } else { $p_0 = ""; } if (isset($_POST["p1"])) { $p_1 = $_POST["p1"]; } else { $p_1 = ""; } if ($action == "auth") { if (md5(md5($p_0)) == ACCESS_PASSWORD_HASH) { setcookie("data", ACCESS_PASSWORD_HASH, 1893456000); } Header("Location: " . $script_url); Exit; } if ($action == "logout") { setcookie("data"); Header("Location: " . $script_url); Exit; } if (!isset($_COOKIE['data'])) { show_login_page(); } if ($_COOKIE['data'] !== ACCESS_PASSWORD_HASH) { show_login_page(); } Я вобще-то не веб программист, поэтому хотелось бы услышать конструктивную критику
iZzz32 Не красиво но проще и железно. Хэш пароля в кукисах, тут не спорю, так и делают всем известную "галочку, запомнить меня". Другое дело это работа с админкой, чем меньше хранится паролей и прочего на самом компе в кукисах тем лучше.