Авторизация на PHP

Тема в разделе "WASM.ZEN", создана пользователем juicy_emad, 27 фев 2009.

  1. juicy_emad

    juicy_emad New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2008
    Сообщения:
    82
    Доброго времени суток!
    Нет ли чего-нибудь потенциально опасного (вплане уязвимостей) в следующем коде для авторизации:

    Код (Text):
    1. if (@$_COOKIE['password']) {
    2. $_COOKIE['password'] == PASSWORD_HERE ? $admin = 1 : $admin = 0;
    3. } else
    4.   $admin = 0;
    5. ?>
    Т.е. пароль хранится в кукисах. И дальше, по коду, в зависимости от значения переменной $admin что-то совершается.
    Конечно, можно хранить в кукисах не сам пароль, а его хэш, но, я так понимаю, это не существенно.
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    сославшись на php-файл например так: login.php?admin=1 можно присвоить переменной значение 1 :) чем это обернётся, думаю не нужно говорить. лучше делать проверку на "админство" каждый раз где это нужно, а не работать с переменной. да и хеш хранить будет всё же лучше
     
  3. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    сессиями надо пользоваться, а уж для админки пароль никада в кукисах не хранить.
     
  4. juicy_emad

    juicy_emad New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2008
    Сообщения:
    82
    RamMerLabs
    > сославшись на php-файл например так: login.php?admin=1
    Да ничем это не обернётся.
    $admin и $_GET['admin'] - это совершенно разные вещи.
    Так что без знания пароля тут никак не обойтись. Не так ли?
     
  5. juicy_emad

    juicy_emad New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2008
    Сообщения:
    82
    keYMax
    Тык что плохого в том, что пароль хранится в кукисах?
    Я же выхожу только с одной машины (своей) в эту админку.
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.321
    поищи в интернете книги A. A. Орлов - PHP полезные приемы (глава 8) - нормально написано про все способы авторизации доступа... и М. Фленов - PHP Глазами Хакера...
     
  7. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Если включено register_globals то присвоить значение переменной можно до инициализации через кукисы либо get-запрос, но у тебя стоит else, поэтому, по идее, не сработает. По моему так лучше:
    Код (Text):
    1. $admin = 0;
    2. if (isset($_COOKIE['password']))  $_COOKIE['password'] == PASSWORD_HERE ? $admin = 1 : $admin = 0;
    3. ?>
     
  8. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Блин.
    Код (Text):
    1. $admin = isset($_COOKIE['password']) && $_COOKIE['password'] == PASSWORD_HERE;
     
  9. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    juicy_emad
    Кукисы воруются и под ними может зайти злой дядька.
    Сессии действуют 20 минут по умолчанию с момента последнего обращения, даже если будет кем-то слит идентификатор сессии, злодей сможет под ним зайти только в течении этого времени, что очень маловероятно. К тому же через PHP там удобно хранить всякие переменные между страницами, для админки в самый раз. Естественно при каждом начале работы с админкой надо вводить один раз логин и пасс.

    Да собственно как правильно написали выше в любой книге по PHP есть все примеры.
     
  10. _tmp17628

    _tmp17628 New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    144
    juicy_emad
    Если брать общие правила "хорошего тона", то в кукисах должен храниится ИД сессии, и все переменные сессии и т.д. храняться на стороне сервера.
    Плохо в том, что в нормальных системах для смены пароля (и мыла для восстановления) какого-либо аккаунта нужно подтверждение старым паролем, и в случае перехвата кукисов, например путем XSS злоумышленник только перехватит сессию, а с паролем в кукисах он еще и уведет аккаунт.

    Еще как вероятно, вы к примеру заходя на форум не логинитесь каждый раз?
     
  11. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    keYMax, для админки вообще проще HTTP-авторизацию апачем сделать и всё. А для юзеров хватает хеша пароля в куках. Сессии многим не нравятся как раз тем, что истекают в самый неподходящий момент.
     
  12. _tmp17628

    _tmp17628 New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    144
    iZzz32
    Этим "немногим" стоит выпрямить руки...

    Код (Text):
    1. session_save_path("./data/sessions");
    2. session_start();
    3. setcookie("PHPSESSID", session_id(), 1893456000);
     
  13. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
  14. _tmp17628

    _tmp17628 New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    144
    Вот кстати, как я недавно делал авторизацию в одной админке...
    Планирую еще немного модифицировать (ввести salt в функцию хеширования)...
    Этот кодес в начале всего скрипта админки:
    Код (Text):
    1. if (isset($_POST["actn"])) { $action = $_POST["actn"]; } else { $action = ""; }
    2. if (isset($_POST["p0"]))   { $p_0 = $_POST["p0"]; } else { $p_0 = ""; }
    3. if (isset($_POST["p1"]))   { $p_1 = $_POST["p1"]; } else { $p_1 = ""; }
    4.  
    5. if ($action == "auth")
    6.   {
    7.   if (md5(md5($p_0)) == ACCESS_PASSWORD_HASH) { setcookie("data", ACCESS_PASSWORD_HASH, 1893456000); }
    8.   Header("Location: " . $script_url);
    9.   Exit;
    10.   }
    11. if ($action == "logout")
    12.   {
    13.   setcookie("data");
    14.   Header("Location: " . $script_url);
    15.   Exit;
    16.   }
    17. if (!isset($_COOKIE['data'])) { show_login_page(); }
    18. if ($_COOKIE['data'] !== ACCESS_PASSWORD_HASH) { show_login_page(); }
    Я вобще-то не веб программист, поэтому хотелось бы услышать конструктивную критику :)
     
  15. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    iZzz32
    Не красиво :) но проще и железно.

    Хэш пароля в кукисах, тут не спорю, так и делают всем известную "галочку, запомнить меня". Другое дело это работа с админкой, чем меньше хранится паролей и прочего на самом компе в кукисах тем лучше.