1

管理ページ (../index2.php) があり、最初にブラウザーを開いたときにホーム URL としてログインしたいと考えています。このページを表示するには、ユーザー名とパスワードでログインする必要があります。明らかに、ログアウトしてブラウザを閉じてから再度開くと、ログイン ページにリダイレクトされます。これは、index2.php ページが最初に開いたときのトップ コードです。

<?php
      require_once ("../includes_kl/initialize.php"); // simply sets up database and other classes including session class
?>
<?php
    if(!$session->is_logged_in()) {
    redirect_to("/cms/login.php");
    }
?>

login.php ページにリダイレクトされますが、そのページは次のことを行います。

require_once ("../../includes_kl/initialize.php");
if ($session->is_logged_in()) {// Skip login page if already logged in.
    redirect_to("index.php");
}

そして、私は明らかにログインしているため (いつ発生したかはわかりません)、index.php に移動します。

ブラウザを開いたときに、Cookie が設定されていることを確認します。そしてクッキーはこれを行います:

  private function check_login() {

    if (isset($_COOKIE['user_id']) && (isset($_COOKIE['username']))) {
        $_SESSION['user_id']= $_COOKIE['user_id'];
        $_SESSION['username'] = $_COOKIE['username'];

    }

    if (isset($_SESSION['user_id'])) {
        $this->user_id = $_SESSION['user_id'];
        $this->username = $_SESSION['username'];
        $this->logged_in = true;
    } else {
        unset($this->user_id);
        $this->logged_in = false;
    }
}

My session Constructor:

function __construct() {
      session_start();
      $this->check_login();
}

更新: 変数をエコーするためにこのコードを追加しました:

function __construct() {
      session_start();
      $this->check_login();
       if ($this->logged_in) {
        echo "Session User Success: " . $this->username;
        } else {
        echo "Session User Fail";
        }
}

ブラウザを最初に開いたときに「Session User Fail」が返されます(結果を確認できるように、index2.php でテスト目的でリダイレクトを削除しました)。

更新2:

Cookieが設定されていないため、問題を追跡しました。

これが私がそれらを設定した場所です:

public function login($user) {
    global $database;
    if ($user) {
        $this->user_id = $_SESSION['user_id'] = $user->id;
        $this->username = $_SESSION['username'] = $user->username;
        setcookie('user_id', $this->user_id, time() + (60 * 60 * 24 * 14));
        setcookie('username', $this->username, time() + (60 * 60 * 24 * 14));
        $this->logged_in = true;
      }
}

これは正しく行われていますか?これは、ユーザーがログインしているときの一部です。Cookie が設定されていることを Chrome で確認しました。それでも、check_login() メソッドでは、最初の "if" ステートメントでそれらを見つけられません。「isset」テストは失敗します。

4

2 に答える 2

0

別の質問の助けを借りてそれを理解しました。それはCookieと関係がありました。setcookie() メソッドでパスとドメインを設定するだけです。

setcookie('username', $this->username, time() + (60 * 60 * 24 * 14), '/', 'domain.com' );

私の login.php (Cookie が最初に設定された場所) は、ブラウザーが開いていた index2.php とは異なるフォルダー レベルにありました。そのため、Cookie は「domain.com/folder/HERE」レベルのフォルダーに対して のみ設定されました (これは私の login.php があった場所: domain.com/CMS/login.php)。

一方、Cookie が設定されていない domain/index2.php に対してブラウザーを開いていました。そのため、Cookieが表示されたlogin.phpページに送信されたため、同じテストに合格し、フィールドに移動して、ログインしていないindex.phpにリダイレクトしました。そのため、ブラウザが私を開いたのですindex.php にアップし、ログインします。

于 2012-05-23T16:13:11.363 に答える
0

いくつかのことを確認する必要があります。

サーバーの応答 HTTP ヘッダーを確認し、そこで Set-Cookie ヘッダーを探す必要があります。存在する場合は、 setcookie関数の問題ではありません。クライアント要求の HTTP ヘッダーを確認し、そこで Cookie ヘッダーを探す必要があります。

ただし、サーバーの応答に Cookie ヘッダーがない可能性が高くなります。さまざまな理由で発生する可能性がありますが、最も可能性が高いのは、「ヘッダーは既に送信されています」という警告です。構成に display_errors = off がある場合、この警告はログ ファイルにのみ表示されます。これは、ログイン関数が呼び出される前にサーバーがデータ (つまり、HTTP 応答本文) の転送を開始し、他のヘッダーを設定できないことを意味します。ヘッダー関数を使用して確認できます。これを行うには、次のコードを index2.php の最初に配置する必要があります。

header('Start: OK');

および check_login 関数内のこのコード:

header('Check-Login: OK');

その後、応答に含まれるヘッダーを確認する必要があります。

後もう一つ。次のような構造は避ける必要があります。

$_SESSION['user_id']= $_COOKIE['user_id'];
$_SESSION['username'] = $_COOKIE['username'];

それは本当のセキュリティギャップです。クライアント側で Cookie を変更できる限り、どのユーザーの資格情報でもログインできます。

于 2012-05-22T22:02:59.370 に答える