0

入力の検証が失敗した場合にedit.php(1) からpost.php(2) から(3) へのフォーム入力を維持するためだけにセッションを操作する必要があるため、ユーザーは(3) でフォームを再入力する必要がありません。(2)は(3)に再投稿しないため、(1)の以前のエントリ。このトンネルを介してデータを一時的に転送するには、いくつかの方法があります。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 は使用せず、次の 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 セッションのベスト プラクティスに近いものです。


解決策:私は最終的にセッション全体を放棄し、1 秒の有効期限を持つ衝突に対処する (少なくとも私のユース ケースでは) トランジェントを実装しました。ありがとう@Robbie

4

1 に答える 1

2

ワードプレスであっても、フォームから投稿するためのセッションは必要ありません。

あなたのスクリプト/プラグインは読むべきです。

  • デフォルト値で値を作成する
  • 「空の」エラー条件を作成する
  • 投稿する場合
    • POST から「デフォルト」値を設定する
    • 値をサニタイズする
    • 値の検証
    • 有効な場合
      • アクションの作成 (例: DB に値を入れる)
      • 結果/成功メッセージを表示する別のページにリダイレクトします (戻るボタンの失敗を防ぎます)
    • 有効でない場合
      • エラー条件のポピュレート
  • 値とエラー条件を使用してフォームを表示します。

ウィザード (複数ページ フォーム) アプローチを使用している場合は、セッションを使用します。このようにして、フォームには常にユーザーの入力内容とエラーが表示されます。


ただし、あなたの質問に答えるために、あなたの addactions() はおそらくあなたが望むものですが、関数は積極的です。

  • 初期化は問題ないようです-っぽい(以下のIDの再生成に関するコメントに注意してください)
  • セッションを使用する他のプラグインを消去するため、クリーンアップは危険です。エントリを削除して ( $_SESSION['empl_form_inputs'] = array(); )、次に進みます。
  • そのようにセッション 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 に答える