Какой самый современный, эффективный и простой способ использования сеансов в PHP?

StackOverflow https://stackoverflow.com/questions/96460

  •  01-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Управление сеансами изменилось некоторое время назад (я думаю, это было около 4.4).Старый механизм все еще работает, но устарел.Это довольно запутанно, поэтому я рекомендую держаться от этого подальше.Сегодня вы используете сеансы, обращаясь к глобальной переменной $_SESSION (это массив).Ты может поместите туда экземпляры объектов, но вам нужно загрузить определения классов для этих объектов перед началом сеанса на следующей странице.Используя автоматическая загрузка могу помочь вам здесь.

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

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

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

Использование сеансов на основе cookiebased Только это нормально, но если вы восстановите идентификатор сеанса при входе в систему, это не добавит никакой дополнительной безопасности и немного снизит доступность.

Другие советы

Что касается простоты, то это ничуть не лучше, чем:

# Start the session manager
session_start(); 

# Set a var
$_SESSION['foo'] = 'whatever';

# Access the var
print $_SESSION['foo'];

Хотя база данных может быть более безопасной для сеансов, вам следует сосредоточиться на том, что вы храните в сеансе в первую очередь - на самом деле она не должна содержать ничего, кроме идентификатора для идентификации пользователя (и, ВОЗМОЖНО, имени пользователя или временной переменной между страницами).

Я бы предложил просто использовать файлы cookie по умолчанию.Сеансы с базой данных дают дополнительный доступ К КАЖДОЙ СТРАНИЦЕ, и хотя не на каждом сайте есть slashdot, нет ничего плохого в предварительной оптимизации чего-то такого простого, как это.

Для использования я бы рекомендовал стандартную глобальную переменную:

$_SESSION['yourvar'] = 'somevalue';

Если вы используете этот метод во всем своем коде, вы можете легко изменить серверную часть позже с помощью session_set_save_handler обработчик сеансов, что дает унифицированный способ реализации серверных частей сеанса.Обратите внимание, что вы можете использовать объект для хранения всей обработки сеанса, просто предоставив массивы для каждой записи - array('Staticclass', 'staticmethod').

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

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

Инкапсулируйте массив $SESSION в объект Session(), который позволяет вам получать переменные из session, get и post аналогичным (но разделяемым) способом, включая автоматические фильтры безопасности, флэш-переменные (var, которые используются один раз, а затем распространяются) и установщики значений по умолчанию.

Взгляните на поведение Symfony в этом вопросе, это очень полезно.

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

session_start();
if( isset($_POST['username']) && isset($_POST['password']) )
{
    if( auth($_POST['username'], $_POST['password']) )
    {
        //Authentication passed
        $_SESSION['user'] = $_POST['username'];
        // redirect to required page
        header( "Location: index.php" );
    } 
    else 
    {
       //Authentication failed redirect to login
       header( "Location: loginform.html" );
    }
} 
else 
{
      //Username and Password are required
      header( "Location: loginform.html" );
}

Во-первых, используйте файлы cookie только в том случае, если у вас нет очень веских деловых причин не делать этого.У меня был клиент, который настаивал на сеансах на основе URL только для проекта.очень неуверен в себе, и с ним трудно работать.

Одна из хороших идей - восстанавливать сеанс при каждом запросе.это значительно снижает вероятность угона.Например.

session_start();
$old_sessionid = session_id();
session_regenerate_id();
$new_sessionid = session_id();

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top