1

ここにあるログイン スクリプトのわずかに変更されたバージョンを使用していますが、session_set_cookie_params() から来ていると思われる動作に遭遇しましたが、これは理解できません。

セッション、Cookie、および header() を使用して、ユーザーをログイン ページにリダイレクトしてから、要求したページに戻しています。私の問題は、最初のページとログイン ページが同じ関数を使用してセッションと Cookie を処理しているにもかかわらず、2 つの別個の Cookie が設定されていたことです。1 つは www.example.com 用、もう 1 つは example.com 用です。これにより、初期ページに設定されたセッション変数がログイン後に読み取られませんでした。

要求されたページのコードの例を次に示します。

requireSSL();
sec_session_start();
if(login_check($mysqli) == false) {
    $_SESSION['origURL'] = $_SERVER['REQUEST_URI'];
    header('Location: https://www.example.com/login.php');
    exit();
}

関数は次のとおりです。

function requireSSL() {
    if($_SERVER["HTTPS"] != "on") {
        header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
        exit();
    }
}

function sec_session_start() {
    $session_name = 'sec_session_id'; // Set a custom session name
    $secure = true; // Set to true if using https.
    $httponly = true; // This stops javascript being able to access the session id. 
    ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies. 
    $cookieParams = session_get_cookie_params(); // Gets current cookies params.
    session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly);
    session_name($session_name); // Sets the session name to the one set above.
    session_start(); // Start the php session
    session_regenerate_id(true); // regenerated the session, delete the old one.     
}

session_set_cookie_params() でドメインを明示的に指定することでこの動作を「修正」できましたが (例: 「example.com」)、最初に 2 つの Cookie が設定された理由を理解したいと思います。ありがとう!

4

1 に答える 1

1

理由 : example.com と www.example.com は、ブラウザの 2 つの異なるドメインであるためです。


example.com 

上位ドメインです。

www.example.com 

example.com の下位レベル ドメインです。

次の方法で、Cookie をより高いドメインに設定します。

setcookie($name, $value, $expire, $path, 'example.com');

によるセッション Cookie についても:

session_set_cookie_params($lifetime, $path, 'example.com'); 

そのため、同様に問題を解決します。

したがって、それらは www.example.com と example.com の両方で有効になります。

setcookie関数のphpマニュアルのドメイン定義を見てください

警告: 高レベル ドメインの Cookie は有効であり、低レベルのすべてのページからアクセスできます。の Cookie にexample.comもアクセスmysubdomain.example.comできます。

したがって、それが望ましくない場合は、Cookie ドメインを区別する必要があります。


私見では:

header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);

ヘッダーを送信する代わりに、エコーして何が起こっているかを確認してください...

于 2013-04-23T21:54:30.993 に答える