Как создать безопасную систему входа в систему php, позволяющую сохранять функционирование? - PullRequest
5 голосов
/ 18 декабря 2009

Я использую простую систему входа в систему на основе SESSION VARS. Как только пользователь входит в систему, устанавливается сеансовая переменная, которая сообщает моему сценарию, что пользователь должен быть принят. Я не использую никаких пользовательских клиентских файлов cookie.

Я хотел бы предложить опцию на экране входа в систему, которая гласит: «Держите меня в курсе весь день». Как это сделать безопасным способом?

Ответы [ 3 ]

14 голосов
/ 18 декабря 2009

Первое: сконфигурируйте директиву session.cookie_lifetime, либо в php.ini, в файлах конфигурации, либо через session_set_cookie_params().

Затем сохраните имя пользователя и хэш-значение пароля в сеансе и проверьте этот логин на каждой странице. Пока это еще действует, они остаются в системе.

Естественное истечение срока действия файла cookie сеанса, как правило, должно приводить в порядок вещи, так как никто не выйдет из системы в середине сеанса (если, конечно, звезды выровнены по нему), если они будут активны. Если это не удастся, я бы посчитал решение eCartoth короткой секундой, поскольку вы могли бы просто добавить вторую строку в оператор if:

if (my_validate_user_function($_SESSION['username'],$_SESSION['passhash']) 
    && $_SESSION['deathstamp'] > time()
) {
    // user is logged in again, oh boy!
}
else {
    // send in the death robots
    header('Location: /login.php',true,302);
}

РЕДАКТИРОВАТЬ: Одна вещь, которую вы могли бы рассмотреть, это фиксация сессии и / или перехват сессии. Чтобы предотвратить это, я бы порекомендовал одно (или оба) из двух решений:

  1. сохранить IP-адрес пользователя в сеансе
  2. используйте session_regenerate_id() после каждой успешной попытки входа в систему.
3 голосов
/ 18 декабря 2009

Когда вы говорите «держите меня в курсе весь день», я предполагаю, что вы имеете в виду только на этой конкретной машине, верно? Вы можете использовать таблицу mysql для запоминания «времени входа в систему» ​​или отметки времени, когда этот вход в систему больше не будет действительным, если они решат оставаться в системе в течение всего дня. Затем добавьте некоторый скрипт в начало вашего кода, который извлекает идентификатор этого пользователя из переменных сеанса. Сравните текущую временную метку этого пользователя с сохраненными «последними действительными значениями», и, если прошло более того времени, вы знаете, что они должны выйти из системы, после чего вы стираете сеанс и заставляете пользователя снова войти в систему. Этот метод означает, что они на самом деле не выйдут из системы, пока они не попытаются что-то сделать после этого, но им это покажется так. Кроме того, вместо использования mysql DB вы также можете сохранить этот последний действительный TS в переменной сеанса.

Так, например, когда пользователь впервые входит в систему с «держать меня в системе весь день выбранным»:

$_SESSION['log_me_out_at'] = strtotime(date("Y-m-d ")."23:59:59");

Затем каждый раз, когда к вашей системе обращаются к странице:

if( $_SESSION['log_me_out_at'] < time() ){
  unset($_SESSION['user_is_accepted_in']);
}
2 голосов
/ 18 декабря 2009

Одним из вариантов может быть создание таблицы MySQL, которая сохраняет переменные сеанса и связывает их с IP-адресами и сроком действия, но я не уверен во всех подробностях того, как это будет реализовано.

Самый простой (хотя не рекомендуемый) способ сделать то, что вы ищете, это установить $_COOKIE с именем пользователя и паролем на компьютере, который ваш сайт будет проверять, когда пользователь входит в систему.

Для дополнительной безопасности, вам лучше сохранить только один файл cookie в виде хеш-кода MD5 с данными пользователя, чтобы предоставить потенциальному хакеру меньше информации о данных учетной записи пользователя. Продолжительность может быть установлена, когда вы устанавливаете куки; php.net имеет достаточно полную документацию о том, как это сделать.

...