Убить активный сеанс, если пользователь забанен - PullRequest
2 голосов
/ 08 сентября 2010

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

Проблема в том, что я новичок в php и чертовски долго пытаюсь выяснить, как выйти из системы пользователя, который в данный момент вошел в систему. В настоящее время мой файл cookie будет длиться 2 недели, и даже если я забанить пользователя, его сеанс останется активным, поэтому он будет иметь доступ в течение 2 недель или меньше.

Как я могу заставить пользователя пройти повторную аутентификацию, не наказывая массы.

Ответы [ 6 ]

3 голосов
/ 08 сентября 2010

Ваш сервер знает, какой файл cookie связан с каждым пользователем. Почему бы просто не удалить этот файл cookie из таблицы «текущих сеансов»?

Если файл cookie - это просто «имя пользователя, который вошел в систему», у вас возникнет реальная проблема, потому что вместо магического числа файл cookie содержит реальную информацию, и его становится легко подделать. Тогда злоумышленник может просто создать cookie-файл со словами «Я [администратор], и я вошел в систему», и это, очевидно, гораздо более серьезная проблема. Поэтому, если вы не можете просто удалить файл cookie сеанса из таблицы «известных файлов cookie», чтобы решить эту проблему, у вас есть более серьезная проблема, о которой нужно беспокоиться.

2 голосов
/ 08 сентября 2010

Если вы выполняете свою систему аутентификации полностью самостоятельно (спасибо за это, кстати), вам просто нужно сбросить значение сеанса, которое содержит их статус аутентификации. Итак, если вы использовали:

<?php
session_start();
if(isset($_SESSION['isloggedin']) && isBannedUser())
{
    session_unset(); 
    session_destroy();
} 
?>

Приведенный выше псевдокод вызывает фиктивную функцию, называемую isBannedUser(), чтобы определить, запрещены они или нет. Если это так, в моем примере выше я вызываю session_unset(), чтобы сбросить все значения, хранящиеся в $_SESSION, а затем session_destroy(), чтобы полностью закрыть сеанс. Некоторые, вероятно, будут утверждать, что вам может не потребоваться сброс, если вы уничтожаете, но я только что привык к очистке всех переменных и значений, которые я делаю в коде.

Это должно быть на каждой странице, чтобы вы проверяли, насколько часто они забанены. После уничтожения $_SESSION пользователь фактически выгоняется из любой части вашего сайта, требующей аутентификации. Вам нужно будет внедрить поддерживающий код в ваш рабочий процесс входа, который запрещает повторному входу заблокированного пользователя.

Надеюсь, это полезно.

1 голос
/ 08 сентября 2010

В файловой системе сеансов ведите счетчик где-нибудь, который запускает периодическую проверку базы данных на наличие обновлений, например:

<?php
    session_start();
    $_SESSION['hits_since_last_verification']++;

    if ($_SESSION['hits_since_last_verification'] > 100) {
       $banished = ... // get banishment flag from database
       if ($banished) {
           $_SESSION['loggedIn'] = FALSE;
       }
    }
?>

, а затем решайте, как долго вы хотите заблокировать пользователячтобы можно было продолжать ковыряться по сайту, пока данные сеанса не обновятся и они не загрузятся.

Другой вариант - это внешний сценарий, который запускается через каталог хранилища сеансов, загружает каждый по очереди, проверяет, заблокирован ли пользовательи обновляет файл сеанса соответствующим образом.Но это было бы болезненно даже для системы с умеренной загруженностью, поскольку вы открываете / снимаете серию / проверяете изгнание / обновляете / повторно сериализуете тысячи файлов сеансов каждые X минут.

1 голос
/ 08 сентября 2010

Если вы храните данные сеанса в базе данных, удалите строку с информацией о сеансе. Или удалите файл, если используете файлы. Затем при следующей загрузке страницы система входа в систему не сможет проверить свои данные для входа в систему (поскольку для этого сеанса нет информации) и предложить им повторно войти в систему.

0 голосов
/ 08 сентября 2010

Вы можете сохранить идентификатор пользователя в сеансе и при каждом запросе проверять, не забанен ли он (запрос SQL).Если это правда, вы уничтожаете его сеанс, поэтому он вынужден повторно подтвердить подлинность.Что, конечно, не получается, потому что он забанен.

0 голосов
/ 08 сентября 2010

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

вы знаете.проверяйте таблицу каждый раз, когда пользователь загружает сеанс, и если он там отсутствует.удалить куки и уничтожить сессию (отправив его в индекс вашего сайта)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...