2

私は基本的なログインシステムを持っています。基本的なログイン/ログアウト機能は次のとおりです。

function login() {
    global $page;

    if ($_COOKIE['adminUser'] == adminUser && $_COOKIE['adminPass'] == adminPass):
        $_SESSION['adminLogin'] = true;
        redirect($_SERVER['REQUEST_URI']);
    elseif ($_POST['adminUser'] == adminUser && $_POST['adminPass'] == adminPass):
        setcookie('adminUser', $_POST['adminUser'], time() + 60 * 60 * 24 * 7);
        setcookie('adminPass', $_POST['adminPass'], time() + 60 * 60 * 24 * 7);
        $_SESSION['adminLogin'] = true;
        redirect($_SERVER['REQUEST_URI']);
    else:
        $page->content->table = new template('admin/login.tpl');
        // it shows the login form
    endif;
}

    function logout() {
        $_SESSION['adminLogin'] = false;
        setcookie('adminUser', false, time() - 60*100000);
        setcookie('adminPass', false, time() - 60*100000);
        redirect(pathApp);
    }

redirect($x)ですheader("Location: $x"); die;

スクリプト全体のどこにも他の COOKIES は設定されていません。

問題は、ログアウト機能が機能していないことです。送信されているヘッダーを確認するために、Firebug を介してこれをデバッグしようとしましたが、すべて問題ないようです。ログアウトの Firebug のログは次のとおりです。

Response Headers

HTTP/1.1 200 OK
Date: Fri, 15 Apr 2011 18:48:57 GMT
Server: Apache
X-Powered-By: PHP/5.2.13
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: adminUser=deleted; expires=Thu, 15-Apr-2010 18:48:56 GMT
adminPass=deleted; expires=Thu, 15-Apr-2010 18:48:56 GMT
Content-Length: 1041
Connection: close
Content-Type: text/html


Request Headers

GET /freeads/admin/logout HTTP/1.1
Host: clienti.bsorin.ro
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://clienti.bsorin.ro/freeads/admin
Cookie: adminUser=q; adminPass=q; PHPSESSID=22faf6e20467b88d97dc7838572cbd47

スクリプトはhttp://clienti.bsorin.ro/freeads/adminにあります。ユーザー名とパスワードは両方とも「q」に設定されています。

ありがとう!

4

4 に答える 4

17

Cookieを適切に設定しなかったため、最初からシステムに欠陥があったようです。pathパラメータは使用しませんでした。Cookieはで設定され/path/login、で削除されていましたpath/logout

正しい方法は、両方のsetcookie()コマンドペア(ログインとログアウト)を次のように変更することでした。

setcookie('adminUser', $_POST['adminUser'], time() + 60 * 60 * 24 * 7, '/');
setcookie('adminPass', $_POST['adminPass'], time() + 60 * 60 * 24 * 7, '/');

setcookie('adminUser', false, time() - 60*100000, '/');
setcookie('adminPass', false, time() - 60*100000, '/');

4番目のパラメーター、pathがに設定されていることに注意してください/。しばらく時間がかかりましたが、私はそれを理解しました:)。

于 2011-04-17T17:26:23.087 に答える
3

サブドメインを使用していることに気付きました。setCookie には、ドメインを指定する 5 番目のパラメーターがあります。サブドメインで Cookie を削除するのは面倒です。これは私のために働いた

setCookie("clockInTime", $param, date('U')+86502,'/', '.mywebsite.com')

最後のパラメーターは、「.」を使用して mywebsite のすべてのサブドメインを取得します。ドメインの前。

于 2011-08-18T06:00:56.693 に答える
0
  1. setcookie を使用する前に、ヘッダーを送信していないことを確認してください。
  2. 中括弧を使用するように条件を変更してください (お願いします)
  3. 同じドメイン(およびパス)でCookieを設定/削除していることを確認してくださいsetcookie($name, $val, $time, '/');

ログアウトが呼び出されると、次のエラーが表示されます。

デバッグ: [class_dispatcher.php : 26] [スカラー [整数 / 浮動小数点数 / 文字列 / ブール値]] ページ -> コンテンツはクラス 'テンプレート' ではありません

setcookie が呼び出される前に出力されているため、これが原因である可能性が最も高いです。

于 2011-04-15T19:11:00.830 に答える