Как предотвратить несколько логинов в веб-сайте PHP

Веб-страница Ловушки C++ Scott Wheeler покрывает некоторые основные ловушки C++.

18
задан Jason 19 January 2012 в 12:30
поделиться

4 ответа

(Обратите внимание, что хотя методика здесь все еще в некоторой степени верна; образцы PHP не следует копировать дословно, так как есть более безопасные способы включения значений, предоставленных пользователем, в запрос SQL)


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

Я рекомендую вам сделать следующее:

Во-первых, создайте хэш, чтобы однозначно идентифицировать пользователь всякий раз, когда он входит в систему. Я полагаю, что sha1 из time () будет достаточно, чтобы избежать коллизий. Что бы вы ни выбрали, убедитесь, что он достаточно разнообразен, чтобы другой входящий в систему пользователь имел невероятно низкий шанс получить тот же хэш (например, не хешируйте IP-адрес или пользовательский агент браузера, поскольку они недостаточно различаются).

Во-вторых, сохраните этот хэш в своей базе данных и в сеансе пользователя во время входа в систему. Это приведет к «выходу из системы» предыдущего пользователя, поскольку хеш должен быть другим каждый раз, когда кто-то входит в систему. in.

Поскольку мы используем сеансы, в браузер пользователя должен автоматически помещаться файл cookie, который будет содержать уникальный идентификатор, который идентифицирует пользователя по его данным сеанса. Содержимое файла cookie на самом деле не вызывает беспокойства.

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

Например:

function authenticateUser($id, $hash, $databaseLink) {
    # SQL
    $sql = 'SELECT EXISTS(
               SELECT 1
               FROM `tbl_users`
               WHERE `id` = \''.mysql_real_escape_string($id).'\'
               AND `hash` = \''.mysql_real_escape_string($hash).'\'
               LIMIT 1
           );';

    # Run Query
    if ($query = mysql_query($sql, $databaseLink)) {
        # Get the first row of the results
        # Assuming 'id' is your primary key, there
        # should only ever be one row anyway.       
        $result = mysql_fetch_row($query);

        # Casting to boolean isn't strictly necessary here
        # its included to indicate the mysql result should
        # only ever been 1 or 0.
        return (bool)($result[0]);
    } else {
        # Query error :(
        return false;
    }
}

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

Если AuthenticateUser () возвращает true , пользователь аутентифицирован. Если false , пользователь не ИЛИ база данных недоступна или есть ошибка SQL.

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

Кроме того, ожидание истечения срока действия cookie - не лучший способ заставить людей, которые были неактивны, выйти из системы, так как вы никогда не должны доверять cookie. Вместо этого вы можете добавить столбец с именем last_active , который вы можете обновлять каждый раз, когда пользователь аутентифицируется. Это также увеличит нагрузку на сервер, но позволит вам вручную переопределить устаревшие входы в систему, удалив хэш для пользователей, которые, скажем, были неактивны в течение 3 часов.

ожидание истечения срока действия cookie - не лучший способ заставить людей, которые были неактивны, выйти из системы, так как вы никогда не должны доверять файлам cookie. Вместо этого вы можете добавить столбец с именем last_active , который вы можете обновлять каждый раз, когда пользователь аутентифицируется. Это также увеличит нагрузку на сервер, но позволит вам вручную переопределить устаревшие входы в систему, удалив хэш для пользователей, которые, скажем, были неактивны в течение 3 часов.

ожидание истечения срока действия cookie - не лучший способ заставить людей, которые были неактивны, выйти из системы, так как вы никогда не должны доверять файлам cookie. Вместо этого вы можете добавить столбец с именем last_active , который вы можете обновлять каждый раз, когда пользователь аутентифицируется. Это также увеличит нагрузку на сервер, но позволит вам вручную переопределить устаревшие входы в систему, удалив хэш для пользователей, которые, скажем, были неактивны в течение 3 часов.

18
ответ дан 30 November 2019 в 07:18
поделиться

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

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

Обычному пользователю кажется, что все «просто работает». Если вы хотите, чтобы «ненормальные» пользователи не распространяли свои учетные данные, это должно служить сдерживающим фактором.

5
ответ дан 30 November 2019 в 07:18
поделиться

Использование JavaScript на стороне клиента для отслеживания вошедшего в систему пользователя ненадежно.

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

При каждой попытке входа в систему, если now () - $ lastlogindate> предопределенное время ожидания, вы должны принять новый вход в систему, в противном случае откажитесь от него.

0
ответ дан 30 November 2019 в 07:18
поделиться

Что вам следует сделать, так это проверить, были ли они активны последние несколько минут при попытке входа в систему. Это можно сделать с помощью штампа lastonline, и его следует устанавливать при каждом запросе страницы в пользовательской таблице.

Если это не сделано с помощью javascript, вы можете проверить при входе в систему, был ли пользователь активен последние 15 минут. В противном случае вы можете войти в систему как новый пользователь.

Вы также можете сделать это с помощью javascript. Сделайте вызов ajax, который запускается каждую минуту или около того.

<script>
setInterval(function() {
  // do the ajax call
}, 60000);
</script>

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

5
ответ дан 30 November 2019 в 07:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: