2

管理者ログイン パネルでセッション名とセッション ID を変更したいと考えています。私の管理パネルでは、Cookie は http のみに設定されています

私の問題は、セッションが設定されていないことです。私のコードに何か問題がありますか 助けてください

コードはindex.phpです

<?php
session_name("websitename");//session name changed
if (session_start()) {
    session_regenerate_id(true);//session id changed
    //$sess_name=session_name();
    setcookie("websitename", session_id(), null, '/', null, null, true);//set cookie httponly  
}

$_SESSION['admin']="login";
header("Location: home.php");
?>

................................................................... ...................................................

home.php

<?php
session_start();
if(!isset($_SESSION['admin']))
echo "you are logout";
else
echo "you are in home";
?>

「あなたはログアウトしています」と印刷するサイト

4

1 に答える 1

5

簡単な答えは、次の行を挿入することです: session_name("websitename"); home.php の最初の行として

なんで?ここで PHP の session_name と session_id の違いを理解しようとしている人のために、次の説明を提供します。

セッション データは、PHP サーバー上の「データストア」と呼ばれるものにあります。通常はディスク ファイルですが、PHP とアプリケーションが特定のサーバーにどのように実装されているかによっては、データベースである可能性もあります (PHP では、アプリケーションがネイティブに提供されたセッション ストレージをオーバーライドできます。

セッション データは「不規則な配列」の形式です。

不規則配列は、セッションごとに一意のキーを使用してデータストアに格納されます。

セッション データをデータストアから PHP スクリプトに取得するには、目的のセッションの正しいキーが必要です。

上記のコード例の index.php で何が起こるかは次のとおりです。

  1. session_name(); を実行します。これは、デフォルトのセッション名 (PHPSESSID) を使用して Cookie データにアクセスするのではなく、代わりに Web サイト名を使用するように PHP に指示します。
  2. session_start(); を実行します。PHP は、キー「website」名を持つブラウザーから送信された Cookie を探します。見つからないため、ランダムなセッション ID を生成して新しいセッションを作成します (「A1」と呼びます。新しいセッション ID を「websitename」のキーを使用して Cookie に保存します。セッション データを次のように初期化します)。空の配列 ($_SESSION=array(); を実行したかのように)
  3. セッションが開始されたかどうかを確認する if ステートメントがあります。これの使い方がおかしい。セッションが開始された場合は、セッションの開始時に行ったことのほとんどをやり直します (配列の初期化以外はすべて)。この時点で、新しく再生成されたセッション ID が「B2」であると仮定します。しかし、セッションが開始されなかった場合は意味をなさないステートメントをさらに 2 つ実行します。セッションが開始されなかった場合、$_SESSION に管理者キーを設定しても意味がありません。これは、セッションが index.php によって正常に初期化されることに依存する home.php にリダイレクトするためです。セッションの開始に失敗した場合、サイトが正しく構成されていないというメッセージをシステム管理者または自分自身に記録する方が理にかなっています。サイトがセッション用に構成されている場合、セッションの開始は常に true を返します。
  4. スーパーグローバル配列 $_SESSION の要素にすることで、キー「admin」を持つセッション変数を「login」の値に設定します。
  5. index.php の一番下まで進む (終了する) と、PHP は $_SESSION 配列の現在の内容を、Cookie にあるキー (つまり、他のスクリプトが見つけることができる "B2") を使用してデータストアに書き込みます。キー「B2」を使用してデータストアに保存されたセッション データは、キー「admin」と値「login」を持つ単一の要素を持つ $_SESSION 配列です。

調べると、home.php のコードは次のようになっていると思います。

  1. session_start() を実行します。以前に session_name() を実行していないため、PHP は PHPSESSID のデフォルト名を使用します。PHP は、セッション名 (PHPSESSID) のキーを使用してブラウザーから送信された Cookie を探しますが、見つかりません。したがって、新しいセッションが作成されます。セッションの新しいランダム セッション ID を生成します。これを「C3」と呼びましょう。セッション データ ($_SESSION) を空の配列に初期化し、PHPSESSID のキーとセッション用に作成されたランダム セッション ID (「C3」) の値を使用して Cookie を作成します。
  2. セッションデータに「admin」のキーを持つ要素があるかどうかを確認する場合は、if/else を実行します。セッション配列は空であるため、if else は false ブランチを選択し、ユーザーがログインしていないことを出力します。

index.php の「if」のために、コードはこれよりも複雑になりますが、問題を単純化するためです。

キー「B2」を使用して管理者の値をセッション データ ストアに保存し、キー「C3」を使用して home.php でそれを探しましたが、見つかりませんでした。これは、index.php では「websitename」のセッション名を使用していますが、home.php では「PHPSESSIONID」のセッション名を使用しているためです。Chrome 開発者ツールのリソース タブを使用して Cookie を見ると、「websitename」と「PHPSESSIONID」の両方の Cookie が表示されます。開発者ツールでは、Cookie は、この説明のために作成した 2 文字のセッション ID ではなく、実際のランダムなセッション ID (26 文字) を表示します。

于 2013-11-03T12:17:45.527 に答える