Как правильно управлять сессиями PHP
Мне нужно работать с сессиями только для поддержки ввода формы из edit.php
(1) для post.php
(2) для edit.php
(3) если проверка ввода не удалась save_post
так что мои пользователи не должны повторно заполнять форму на edit.php
(3) с их предыдущими записями в edit.php
(1) с post.php
(2) не повторно отправлять в edit.php
(3). Существует несколько способов передачи данных через этот туннель:
- WordPress использует строку запроса для своих сообщений - кроме общих минусов строк запроса для моей цели, я не пошел этим путем, как мой
$_POST
vars может быть слишком много для строки запроса - Transient API - нет, не этот, либо по (удаленно возможным) причинам коллизии
- Изменить edit.php и post.php напрямую - неустойчиво, особенно при обновлении. Я мог бы искать крючки для этого, если я не могу найти что-нибудь еще
- сессий,
среди других.
Я не буду использовать сессии для входа в систему (так как я использую WordPress, я позволю WordPress позаботиться об этом.) Из поисков в Интернете я вставил следующее в свой functions.php
:
/*
* manage sessions
*/
// http://wblinks.com/notes/secure-session-management-tips
// http://devondev.com/2012/02/03/using-the-php-session-in-wordpress/
// http://en.wikipedia.org/wiki/Session_fixation
// http://www.php.net/manual/en/function.session-regenerate-id.php
if (is_admin()) add_action('init', 'empl_sesh_start', 1);
add_action('wp_login', 'empl_sesh_cleanup');
add_action('wp_logout', 'empl_sesh_cleanup');
function empl_sesh_start() {
session_start();
// check if loaded session is server-generated
if (!isset($_SESSION['IS_SERVER_TRUSTED']))
session_regenerate_id(true); // if not, regenerate id and clean-up previous session files
// regenerate id for every request
session_regenerate_id();
$_SESSION['IS_SERVER_TRUSTED'] = true; // set flag
}
// cleanup
function empl_sesh_cleanup() {
session_start(); // needed for the rest of this function to work
$_SESSION = array(); // cleanup session variables
session_regenerate_id(true); // regenerate id and clean-up previous session files
session_destroy();
}
Мне просто нужно знать, правильно ли я понял. Я особенно обеспокоен
- правильны ли порядок и вызовы операторов сеанса?
- они необходимы (чтобы сделать сеанс менее уязвимым, как указано в сетевых статьях)?
Меня также интересует, что я читаю о том, как отключить куки и их сложности - нужно ли это делать? Я не использую куки, я просто использую две переменные сессии:
// persist form vars to next load
$_SESSION['empl_form_inputs'][] = $_POST['empl_age'];
// more similar code here...
$_SESSION['empl_form_inputs'][] = $_POST['empl_id'];
// persist message array to next load
$_SESSION['empl_messages'] = $empl_messages;
Я разместил это здесь, а не на wordpress.stackexchange.com, поскольку (я думаю) это не вопрос WordPress, а скорее лучшая практика PHP-сессии.
РЕШЕНИЕ: Я закончил тем, что отказался от всего сеанса Caboodle и реализовал переходные процессы с обращением к коллизиям (по крайней мере для моего случая использования) с истечением 1 секунды. спасибо @Robbie
1 ответ
Вам не нужно сессий для публикации из формы, даже в WordPress.
Ваш скрипт / плагин должен читать.
- Создать значения со значениями по умолчанию
- Создать "пустые" условия ошибки
- Если сообщение
- Заполните значения по умолчанию из POST
- Очистить ценности
- Проверить значения
- Если действительный
- Создать действие (например, поместить значения в БД)
- Перенаправить на другую страницу с сообщением о результате / поиске (предотвращает сбой кнопки возврата)
- Если не действителен
- Условия ошибки Poulate
- Форма отображения, используя значения и условия ошибки.
Вы бы использовали сеанс, если бы использовали подход мастера (многостраничная форма). Таким образом, форма всегда показывает, что вводит пользователь и ошибки.
Однако, чтобы ответить на ваш вопрос, ваши addactions(), вероятно, то, что вы хотите, но функции агрессивны.
- Инициализация выглядит отлично - обратите внимание на комментарий по восстановлению идентификатора ниже)
- Очистка рискованна, так как вы уничтожите все другие плагины, которые используют сеансы. Просто удалите свои записи ( $_SESSION['empl_form_inputs'] = array();) и двигайтесь дальше
- Если вы возитесь с таким идентификатором sesson, вы полностью облажаете любые другие плагины, которые используют сессии.
- Для "безопасности" сохраните тот же идентификатор сеанса, но отследите, откуда он пришел, и дайте ему время ожидания. Поэтому, если session_id() = "ABC" не использовался в течение 10 минут или был получен от другого пользовательского агента, игнорируйте те значения, которые были у вас, и начните снова.
Пример тайм-аута:
if ($_SESSION['empl_form_expires'] > time()) { // Also add user agent chack or something
$_SESSION['empl_form_inputs'] = array(); // Clear values
} else {
$_SESSION['empl_form_expires'] = time() + 600; // Keep the time running
}