Как правильно управлять сессиями PHP

Мне нужно работать с сессиями только для поддержки ввода формы из edit.php(1) для post.php(2) для edit.php(3) если проверка ввода не удалась save_postтак что мои пользователи не должны повторно заполнять форму на edit.php(3) с их предыдущими записями в edit.php(1) с post.php(2) не повторно отправлять в edit.php(3). Существует несколько способов передачи данных через этот туннель:

  1. WordPress использует строку запроса для своих сообщений - кроме общих минусов строк запроса для моей цели, я не пошел этим путем, как мой $_POST vars может быть слишком много для строки запроса
  2. Transient API - нет, не этот, либо по (удаленно возможным) причинам коллизии
  3. Изменить edit.php и post.php напрямую - неустойчиво, особенно при обновлении. Я мог бы искать крючки для этого, если я не могу найти что-нибудь еще
  4. сессий,

среди других.

Я не буду использовать сессии для входа в систему (так как я использую 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();
}

Мне просто нужно знать, правильно ли я понял. Я особенно обеспокоен

  1. правильны ли порядок и вызовы операторов сеанса?
  2. они необходимы (чтобы сделать сеанс менее уязвимым, как указано в сетевых статьях)?

Меня также интересует, что я читаю о том, как отключить куки и их сложности - нужно ли это делать? Я не использую куки, я просто использую две переменные сессии:

// 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
}
Другие вопросы по тегам