0

セッションを使用してユーザーを自分のサイトにログインしています。

ログインフォームは、入力をlogin-execファイルに送信します。このファイルは、dbにクエリを実行し、ログイン情報を検証します。login-execファイルの先頭に配置session_start();し、以下のスニペットを使用してセッションにデータを書き込みました。

session_regenerate_id();
$member = mysql_fetch_assoc($result);
$_SESSION['SESS_MEMBER_ID'] = $member['id'];
$_SESSION['Username'] = $member['username'];
$_SESSION['key'] = $member['Serial'];
session_write_close();
header('Location: account.php');

account.phpファイルの先頭で、セッションを検証するためにauth.phpが必要です。

account.php:require_once('auth.php');

auth.php:

<?php
//Start session
session_start();

//Check whether the session variable SESS_MEMBER_ID is present or not
if(!isset($_SESSION['SESS_MEMBER_ID']) || (trim($_SESSION['SESS_MEMBER_ID']) == '')) {
    header("Refresh: 5; url=login.php");
    //echo $_SESSION['SESS_MEMBER_ID'];
    die("Access Denied!");
    exit();
}
?>

常に最初にログインすると、アクセスが拒否されたことが返されます。スクリプトがログインページにリダイレクトして再試行すると、常に機能します...セッションが開始される前に先頭の空白があると当初思っていたので、PHPファイルをBOMなしでUTF-8に保存しました。それは問題を解決しませんでした、そして私は本当にこれを理解することができません。

なぜこれが起こっているのかについてのアイデアはありますか?

4

2 に答える 2

0

問題はlogin-exec.phpスクリプトのリダイレクトURLにあると思います。例えば:

http://www.mydomain.com/mysubdirectory/login.phpにアクセスしてlogin.phpスクリプトをロードし、login-exec.phpのヘッダーリダイレクトがhttp://subdomain.mydomain.com/accountを指している場合.phpドメインが変更されたため、PHPSESSIDが再生成されていました。

そこで、ヘッダーリダイレクトを完全なURLではなくaccount.phpに変更しました。これにより、問題が解決しました。

subdomain.mydomain.comまたはmydomain.com/subdirectory/のいずれかの完全なURLを使用することもできますが、そうすると、ユーザーとスクリプトの移植性が制限されます。簡単な答え..ドメインが同じままであることを確認してください。そうでない場合は、これも解決すると確信しているセッション名を設定できます。しかし、私の場合header('Location: script.php');はうまくいきました。

于 2012-10-22T02:49:13.900 に答える
-1

session_write_close();を削除します。

それでも解決しない場合は、account.phpファイルのセッションが失われている可能性があります。

session_start();auth.phpページを要求する前にを呼び出します。

于 2012-10-21T16:38:09.947 に答える