0

如果输入验证失败,我只需要使用会话来维护从edit.php(1) 到post.php(2) 到(3) 的表单输入,这样我的用户就不必用他们的 (3)重新填写表单由于 (2) 之前在 (1)的条目不会重新发布到(3)。有多种方法可以通过此隧道传输数据:edit.phpsave_postedit.phpedit.phppost.phpedit.php

  1. WordPress 使用查询字符串作为它的消息 - 除了查询字符串的常见缺点之外,我没有这样做,因为我的$_POST变量对于查询字符串来说可能太多了
  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. 它们是否有必要(如在线文章所指出的那样,努力使会话不那么容易受到攻击)?

我还关心我读到的关于取消设置 cookie 及其复杂性的内容 - 我需要这样做吗?我不使用任何 cookie,我只使用两个会话变量:

// 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 Session 最佳实践。


解决方案:我最终放弃了整个会话 caboodle 并实现了 1 秒到期的冲突解决(至少对于我的用例)瞬态。谢谢@Robbie

4

1 回答 1

2

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

您的脚本/插件应该阅读。

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

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


但是,要回答您的问题,您的 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
}
于 2012-05-18T04:07:00.627 回答