Надежное создание и уничтожение сеансов входа в PHP - программирование
Подтвердить что ты не робот

Надежное создание и уничтожение сеансов входа в PHP

Это мой код для проверки подлинности на веб-сайте. Я не уверен, правильна ли моя логика. Если имя пользователя и пароль верны, выполните следующее:

if(session_start())
{
        session_regenerate_id(true);//without this the session ID will always be the same
        $_SESSION['loggedInUser'] = $uName;
        echo 'You are now logged in';
}
else echo 'Right password/username but session failed to start';

Последующие страницы проверяют, зарегистрирован ли пользователь в

session_start();
if(isset($_SESSION['loggedInUser'])
{
 //rest of page
}
else echo 'you must log in';

При выходе из системы у меня есть

session_start();//if I don't have this the next line produces an error
session_unset();//destroys session variables
session_destroy();//ends session

Я не хочу вызывать session_start() при выходе из системы, но если у меня его нет, я получаю сообщение Trying to destroy uninitialized session. Как я могу это исправить?

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

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

5/6 ответов имеют меньше голосов 0:( Может ли проголосовать за избирателей, чтобы я знал, на что обратить внимание?

4b9b3361

Ответ 1

Прежде всего, вы должны прочитать Руководство по кодированию безопасности WebAppSec Mozilla - Управление сеансами и OWASP A3-Broken Authentication and Session Управление. Вы можете настроить обработчик сеанса PHP для удовлетворения этих требований.

Первым недостатком, который вы должны предотвратить, является A9-Недостаточная защита транспортного уровня. Короче говоря, вы не хотите, чтобы кто-то уговаривал сеанс, используя такой инструмент, как Firesheep. Эта атака может быть предотвращена, заставляя браузер отправлять только идентификатор сеанса по https:

session.cookie_secure=1

Вы можете запретить злоумышленнику получать идентификатор сеанса с помощью XSS, установив флаг httponly:

session.cookie_httponly=1

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

session.use_cookies=1
session.use_only_cookies=1

Затем вы хотите, чтобы у вас было по крайней мере 128 бит энтропии от CSPRNG. В системах * nix вы можете использовать /dev/urandom:

session.entropy_file="/dev/urandom"
session.entropy_length=16

Обработчик сеанса - это еще не все. Вам по-прежнему нужно беспокоиться о атак типа Cross-Site Request Forgery (например, CSRF или "Session Riding" ) и Cross-Site Scripting (XSS). XSS можно использовать для защиты CSRF (даже с помощью http_only cookie!). Clickjacking также может использоваться злоумышленником для выполнения несанкционированных действий.

После того, как вы установили эти параметры конфигурации, просто позвоните session_start(). Что касается уничтожения сеансового вызова session_destroy(), когда пользователь выходит из системы, это просто!

Ответ 2

Чтобы безопасно уничтожить сеанс, я бы использовал следующий код:

session_start();
// Unset all session values
$_SESSION = array();
// get session parameters 
$params = session_get_cookie_params();
// Delete the actual cookie.
setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
// Destroy session
session_destroy();

Чтобы уничтожить сеанс, вам нужно сначала запустить его, поскольку вы обнаружили, что он не работает, если вы не включаете session_start();

Session_regenerate_id(); Функция генерирует новый идентификатор сеанса для пользователя. Если используется с true (session_regenerate_id (true);), тогда старый идентификатор сеанса удаляется с сервера, когда он генерирует новый. Причина создания нового идентификатора сеанса на каждой странице заключается в том, что он делает попытку захвата сеанса намного сложнее (почти невозможно), потому что пользователи постоянно меняют идентификатор сеанса.

(Просмотреть руководство PHP.net по session_regenerate_id();)

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

$user_id = $_SESSION['user_id'];
$login_string = $_SESSION['login_string'];

// Query Database and get hashed password

$login_check = hash('sha512', $password.$ip_address.$user_browser);

if($login_check == $login_string) {
     // Logged In!!!!
     return true;
} else {
     // Not logged in
     return false;
}

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

Я написал статью о wikihow.com о безопасном входе в систему и аутентификации, можно найти здесь.

Ответ 3

Вы можете просто написать:

session_start(); // session should be started before it can be used.

Вы можете назначить идентификатор пользователя зарегистрированного участника. Для этого вы можете ввести имя пользователя и пароль из пользовательского ввода и проверить его в своем db и вернуть идентификатор пользователя. Для большей безопасности вы можете иметь строки, например. "demo" и "test" просто md5 и смешивать его с userid следующим образом.

$userid=md5("demo").$userid.md5("test");// you can set any string instead of demo and test.

$_SESSION['userid']=$userid;

При использовании на другой странице

session_start(); // If you are have not started it or included above code file in it.

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

Для уничтожения просто используйте:

session_unset($_SESSION['userid']); // It will only unset the session userid completely. 

Убедитесь, что перед использованием любого сеанса вам нужно его запустить. В лучшем случае вы можете запустить сеанс в одном файле, скажем, init.php и включить его там, где вы хотите использовать сеанс

Ответ 4

Вы можете сначала использовать session_id(), чтобы определить, имеет ли пользователь уже сеанс, если нет, то используйте session_start().

примеры кодов из литиевого фейерверка:

/**
 * Starts the session.
 *
 * @return boolean True if session successfully started (or has already been started),
 *         false otherwise.
 */
protected static function _start() {
    if (session_id()) {
        return true;
    }
    ...
    return session_start();
}

После вызова _start() вы можете безопасно позвонить session_destroy()

Ответ 5

Чтобы уничтожить сеанс без использования "start_session()", сначала проверьте, есть ли активный сеанс, не похожий ниже

$existingSessionId = session_id();
if ($existingSessionId != "")
{
     // Initialize the session.
     session_start();

     // Unset all of the session variables.
     $_SESSION = array();

     // If it desired to kill the session, also delete the session cookie.
     // Note: This will destroy the session, and not just the session data!
     if (ini_get("session.use_cookies")) {
         $params = session_get_cookie_params();
         setcookie(session_name(), '', time() - 42000,
             $params["path"], $params["domain"],
             $params["secure"], $params["httponly"]
         );
     }

     // Finally, destroy the session.
     session_destroy();
}
else
{
     // No Active sessions
}

session_regenerate_id (true), просто замените старый идентификатор сеанса на новый, но он не отключит старый идентификатор сеанса. Это необходимо позаботиться о session_destroy и удалении cookie сеанса.

Браузер отправит сеанс cookie на сервер, когда сеанс будет уничтожен. PHP получит этот идентификатор сеанса, и когда вы запустите start_session(), он будет использовать идентификатор сеанса, отправленный браузером. Если вы удалите файл cookie сеанса, session_start сгенерирует новый идентификатор сеанса, и вам не нужно будетзывать session_regenerate_id()