Какой самый актуальный, хороший метод и самый простой способ использовать сессии в PHP? - PullRequest
4 голосов
/ 19 сентября 2008

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

Ответы [ 7 ]

3 голосов
/ 19 сентября 2008

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

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

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

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

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

2 голосов
/ 19 сентября 2008

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

# Start the session manager
session_start(); 

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

# Access the var
print $_SESSION['foo'];
1 голос
/ 19 сентября 2008

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

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

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

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

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

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

0 голосов
/ 11 сентября 2017

Сессии были важной частью моих знаний 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" );
}
0 голосов
/ 19 сентября 2008

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

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

0 голосов
/ 19 сентября 2008

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

0 голосов
/ 19 сентября 2008

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

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

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

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

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