1

私が解決できない/部分的にしか解決できない本当に厄介な問題。あなたのプロのための素敵なジューシーなもの。

基本的なログインシステムを設定しました。このような:

Login.php:

  1. ライン1:session_start();
  2. if($_SESSION['logged_in'] == true) header("Location: /controls.php);すでに詳細を入力している場合は、確認してください。
  3. まだ入力していない場合、有効な場合、ユーザーは資格情報を入力します。$_SESSION['logged_in'] = true;
  4. データベースのクレデンシャルがチェックされ、セッションがtrueに設定されたら、PHPを使用してリダイレクトしますheader("Location: /controls.php);

これでセッションが設定されたことを覚えておいてください。

Controls.php

  1. ライン1:session_start();
  2. 2行目:if($_SESSION['logged_in'] != true) {header("Location: /index.php");}

すぐに私はChromeとFirefoxでのみindex.phpに移動します。

また、私はaccounttools.php、セッションが再び必要とされるところを持っています。アクセスしようとするaccounttools.phpと、セッションが破棄/設定解除され、ロードしようとするとaccounttools.php、ヘッダーが/index.phpページにリダイレクトされます。これもFirefoxとChromeでのみです。

私も何かを追加する必要があります。に戻ってlogin.php再ログインすると、すべてが正常に機能し、セッションが正しく設定されます。これはブラウザベースのバグですか?PHPはデータがブラウザに送信される前に実行されるので、何かがユーザーに届くまでにPHPがすでに実行されている場合、これらのブラウザは一体どのように異なる動作をすることができますか?

ログインファイル:

// Login.php
<?php session_start();

if($_SESSION['logged_in'] == true)
{
    header("Location: /controls.php");
    exit();
}

if($_POST['username_login'] && $_POST['password_login'])
{
    // Do necessary database work to check credentials (edited out here).
    // ...    
    // Check re-hashed pass against database hash (password checking)
    if($make_password == $current_user[0]['password'])
    {
        // If this is OK login is a success.
        $_SESSION['logged_in'] = true;
        header("Location: /controls.php");
        exit();
    }
}
?>

コントロールファイル:

// controls.php
// This page instantly redirects to index.php
<?php session_start();

// Go to homepage if logging out.
if($_POST['logging_out']) 
{
    unset($_SESSION['logged_in']); 
    header("Location: /index.php"); 
    exit();
} 
// No access unless logged in.
// This session seems to no longer exist at this point. Why??
if($_SESSION['logged_in'] != true)
{
    header("Location: /index.php");
    exit();
}
?>

編集:私は何か他のものを発見しました:ログインして$_SESSION-restrictedページのURLを手動で入力しても、$_SESSIONは破棄されません。

$_SESSIONGoogleとMozillaでthが設定解除/破棄される原因となるheader()リダイレクトの一部があります。

私も狂ったようにグーグルしてきました、そして明らかにこれはPHPコーダーの間で一般的な問題です。誰かがこれが何であるかについての手がかりを持っている必要がありますか?

4

1 に答える 1

1

ログインに成功した後のリダイレクト方法に問題があります。これはjavascriptリダイレクトであるため、すべてのphpの実行が終了し、結果がブラウザーに送信された後にのみ発生します。つまり、リダイレクト後のコードも実行されます。

最後までブラウザに何も出力せず、次を使用することをお勧めします。

header("Location: /...");
exit();

リダイレクトしたい場所のどこでも組み合わせて、リダイレクトコードの後でセッションに何も起こらないようにします。

問題が発生しないようにheaders already sent、次のようなものを取り除くこともお勧めします。

?>
<?php

の最初の行のようにlogin.php

于 2012-07-12T01:19:44.153 に答える