несколько вопросов / вопросов, касающихся сессий - PullRequest
0 голосов
/ 07 ноября 2011

Я кодировал свою первую систему сессий.Вопросы ниже.

  // INDEX.PHP
    include("db.php"); // this file starts session with session_start(); also changes the default session name

    if($_POST['login']){ $login = escape($_POST['login']); }
    if($_POST['password']){ $password = escape($_POST['password']); }

    if(isset($login) && isset($password)){ // LOGIN ATTEMPT

    // check for brute force attacks 
    $btime = $time-600; // 10 minutes
    $pull = $DB->query("SELECT * FROM logins WHERE user='$login' AND time>$btime");
    if($DB->num_rows($pull) > 5){ // more than 10 tries in the last 10 minutes


            $error = "Too many login attempts have been made with this login. ";
    // maybe lock the account for x hours

        }else{

        // AUTHENTICATE
        $sql = $DB->query("SELECT * FROM users WHERE user='$login' AND password='$password'");
        if($DB->n

um_rows($sql) == 1){  // AUTHENTICATED
    $user = $DB->fetch_array($sql);
    $ok = 1;    
            session_regenerate_id();
            $_SESSION['userid'] = $user['id'];
            $_SESSION['agent'] = md5($_SERVER['HTTP_USER_AGENT']);
            $_SESSION['idle'] = $time; 
            header("Location: welcome.php"); // REDIRECT TO USER AREA

    }else{  // NOT AUTHENTICATED
        $ok = 0;
        $error = "Wrong pass or login.";
    }
    // log all attempts (removed)
    }
    }

Функция, которая проверяет сеанс:

function checksession(){
    global $DB, $time;

    if($_SESSION['userid'] > 0){

        $userid = intval($_SESSION['userid']);
        $user = $DB->fetch("SELECT * FROM users WHERE id=$userid");
        $idle = $time-$_SESSION['idle'];

        if(!$user){ header("Location: index.php"); }
    elseif($_SESSION['agent'] != md5($_SERVER['HTTP_USER_AGENT'])){ session_destroy(); header("Location: ".$site."index.php"); } // check user agent
    elseif($idle > 7200){ session_destroy(); header("Location: ".$site."index.php"); } // destroy session if no activity for 2 hours
    else{ 
        $_SESSION['idle'] = $time;
    }
    }else{ header("Location: ".$site."index.php"); // user id not set
    }
    return $userid;
}

Функция выхода из системы

function logout(){
session_destroy();
header("Location: index.php");
}

Работает нормально, но не идеально.

Проблемы:

  • Когда я делаю session_regenerate_id ();идентификатор сеанса изменяется, но старый также остается активным.Так что это довольно бесполезно.Я делаю это, когда уровень безопасности меняется.Я также подумал сделать это периодически.Я использую MAMP с php 5.3.6.

  • Если пользователь не должен был уничтожать сеанс и просто закрывать браузер, файлы сеанса, похоже, остаются в системе вечно.Я хотел бы знать, как 1) заставить сеансы умереть через X часов, даже если пользователь активен.2) Заставьте сеанс умереть, если пользователь бездействует (вроде как система, которая у меня есть сейчас, но со стороны системы).

  • Я заметил, что если я изменю cookie сессии раньшерегистрация в том же файле сеанса сохраняется в папке файлов сеанса (пусто) в дополнение к новому сгенерированному идентификатору с информацией о пользователе.Не уверен насчет этого, просто подумал, что это странно.

  • Я правильно уничтожаю сессии?

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

1 Ответ

1 голос
/ 07 ноября 2011

session_regenerate_id (): Идентификаторы сеанса на самом деле являются просто большими случайными числами. PHP реализует свои идентификаторы сессий как очень случайные, чтобы люди не могли просто угадать или увеличить действительный идентификатор сессии. Тем не менее, если злоумышленник получит действительный идентификатор сеанса, он может «захватить» ваш сеанс. Изменение идентификатора сеанса действительного сеанса действительно не решает эту проблему. Вам необходимо добавить еще один уровень безопасности, возможно, связав IP-адрес клиента с идентификатором сеанса. Таким образом, вы можете почти опубликовать идентификатор сеанса (не рекомендуется), но злоумышленник не сможет воспользоваться этим, поскольку он не сможет завершить TCP-соединение с поддельным IP-адресом.

Если пользователь не хочет уничтожить сеанс и просто закрыть браузер, файлы сеанса, похоже, навсегда останутся в системе. Сеансовый cookie будет оставаться на клиентском компьютере до тех пор, пока его браузер не решит, что его срок действия истек Я думаю, что время по умолчанию составляет 24 минуты. Файл сеанса будет оставаться на сервере до тех пор, пока он не будет собран сборщиком мусора сеанса PHP.

Я хотел бы знать, как 1) заставить сеансы умереть через X часов, даже если пользователь активен. Это может контролироваться параметром конфигурации PHP: session.gc-maxlifetime . Обратите внимание, что вы также захотите изменить другие параметры session.gc для принудительной очистки. См. Также .

Это также применимо, если пользователь бездействует.

РЕДАКТИРОВАТЬ: Я прочитал это неправильно. Это не относится к активному пользователю. Для активного пользователя вам придется вручную следить за тем, как долго он вошел в систему, и «выйти из него».

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

Правильно ли я уничтожаю сеансы? На самом деле, нет. Вы также можете попытаться заставить клиента удалить свой файл cookie сеанса, прежде чем удалить файл cookie на стороне сервера. Это упоминается здесь .

Как последнее замечание, я не уверен, что проверка на USER_AGENT клиента является хорошей идеей, особенно потому, что ее довольно легко подделать. Следует рассмотреть возможность проверки полного (не хешированного) IP-адреса, поскольку для этого требуется трехстороннее рукопожатие. (Обратите внимание, что это все еще уязвимо для атак MITM, если вы не общаетесь через SSL)

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