如何正确管理PHP会话

时间:2012-05-18 03:29:59

标签: php session session-variables sessionid

如果输入验证在{{1}上失败,我只需要使用会话来保持从edit.php(1)到post.php(2)到edit.php(3)的表单输入}},以便我的用户无需在save_post(3)处重新填写表单edit.php(1),因为edit.php(2)不会重新发布到post.php(3)。有许多方法可以通过此隧道暂时生成数据:

  1. WordPress使用查询字符串作为其消息 - 除了为我的目的查询字符串的常见缺点,我没有这样做,因为我的edit.php变量可能对查询字符串来说太多了
  2. Transient API - nope,而不是(远程可能的)碰撞原因
  3. 直接修改edit.php和post.php - 特别是在更新时不可持续。如果我找不到其他任何东西,我可以寻找钩子
  4. 会话,
  5. 等。

    我不会使用会话登录(因为我正在使用WordPress,我会让WordPress处理这个。)从网上搜索,我在$_POST中插入了以下内容:

    functions.php

    我只需要知道我是否做对了。

    我特别关注
    1. 是顺序,并且会话语句的调用是否正确?
    2. 是否必要(为了使会话不那么脆弱,如在线文章所指出的那样)?
    3. 我也关注我读到的关于取消设置cookie及其复杂性的内容 - 我是否需要这样做?我不使用任何cookie,我只使用两个会话变量:

      /*
       * 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();
      }
      

      我在这里发布了这个而不是在wordpress.stackexchange.com上(我认为)这不是一个真正的WordPress问题,而是更多的PHP会话最佳实践。


      解决方法:我最终放弃了整个会话,并实施了碰撞解决(至少对我的用例来说)1秒到期的瞬态。谢谢@Robbie

1 个答案:

答案 0 :(得分:2)

您不应该需要会话来从表单发布,甚至不需要在wordpress中发布。

您的脚本/插件应该是可读的。

  • 使用默认值创建值
  • 创建“空”错误条件
  • 如果发布
    • 从POST
    • 填充“默认”值
    • 清理值
    • 验证值
    • 如果有效
      • 创建操作(例如,将值放入数据库中)
      • 重定向到另一个显示result / scucess消息的页面(防止后退按钮失败)
    • 如果无效
      • Poulate错误情况
  • 使用值和错误条件显示表单。

如果您使用向导(多页表单)方法,则可以使用会话。这样,表格会显示用户输入的内容和错误。


但是,要回答你的问题,你的addactions()可能就是你想要的,但功能却很激进。

  • init看起来很好 - ish(注意下面重新生成ID的注释)
  • 清理是有风险的,因为您将删除使用会话的任何其他插件。只需删除您的条目($ _SESSION ['empl_form_inputs'] = array();)并继续
  • 如果你搞乱这样的sesson ID,你就会完全搞砸任何其他使用会话的插件。
  • 对于“安全性”保留相同的会话ID,但跟踪它的来源并给它一个超时。因此,如果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
}