2

したがって、ここに私のコードがあり、私がクリックされたことを覚えている場合に 1 年の有効期限を送信します。そうでない場合は、session_set_cookie_params() を 0 に設定します。これは、ブラウザーが閉じられたときにセッションを破棄する必要があることを意味します。しかし、何らかの理由でそのように機能していません。

これは私のログインページです:

session_start();
if (isset($_POST['username']) && isset($_POST['password'])) {

    if (($_POST['username'] == $user) && ($_POST['password'] == $pass)) {

    if (isset($_POST['rememberme'])) {
        $_SESSION['username'] = $user;
        $_SESSION['start'] = time();
        $_SESSION['expire'] = $_SESSION['start'] + (60*60*24*365);
}
    else{
        $_SESSION['username'] = $user;
        session_set_cookie_params(0);
    }
    header('Location: index.php');

} else {
    $p->addContent('<font color = red>Wrong</font>');
}
}

これは私のインデックスページです:

session_start();


if (isset($_POST['rememberme'])){
    $user = $_SESSION['username'];

}
else {
    $user = $_SESSION['username'];
    session_set_cookie_params(0);
}

if ($user == null) {
    $user = 'Guest';
    $logout = $p->header()->addButton('Login', 'login.php', 'a', 'home', false, false, true);
    $logout->rel('external');
}   
else{
    $logout = $p->header()->addButton('Logout', 'logout.php', 'a', 'delete', false, false, true);
    $logout->rel('external');
}
4

2 に答える 2

3

とても簡単です。session_set_cookie_params(0);を呼び出した後に呼び出しても、セッションには影響しませんsession_start();

コードを次のように並べ替えるだけです。

if (isset($_POST['username']) && isset($_POST['password'])) {
    if (($_POST['username'] == $user) && ($_POST['password'] == $pass)) {
        if (isset($_POST['rememberme'])) {
            session_start();
            $_SESSION['username'] = $user;
            $_SESSION['start'] = time();
            $_SESSION['expire'] = $_SESSION['start'] + (60*60*24*365);
        } else {
            session_set_cookie_params(0);
            session_start();
            $_SESSION['username'] = $user;
        }
    header('Location: index.php');
    } else {
        session_start();
        $p->addContent('<font color = red>Wrong</font>');
    }
} else {
    session_start();
}

編集:

session_set_cookie_paramsまた、現在のスクリプトでのみ機能し、 を使用するたびに再度呼び出す必要があることにも価値はありませんsession_start()。使用する必要があるかどうかを示すために Cookie を設定すると便利な場合があります。

于 2013-08-26T22:26:49.653 に答える
2

あなたのコードの時点ではsession_set_cookie_params()、どのような場合でも呼び出されません。したがって、私はこれを行うことを提案します:

session_set_cookie_params(0);
session_start();

if (isset($_POST['username']) && isset($_POST['password'])) {
...

session_set_cookie_params()セッション Cookie に対して常に呼び出すと、実際には便利です。

ユーザー レベルの変更ごとに新しいセッション ID を生成する

アプリケーションを攻撃者から保護するには、ユーザーの役割が変更されるたびに sessionID を変更することが絶対に必要です。

  • 匿名ユーザー -> ログイン ユーザー
  • ログインユーザー -> 匿名ユーザー
  • ログインユーザー -> 管理ログインユーザー
  • ...

したがって、ユーザーがログインまたはログオフした場合は、次のようにセッション ID を再生成してください。

session_regenerate_id( true );

OWASPPHP セキュリティ チート シートを参照してください。

セッションファイルは定期的に削除されます

PHP の標準セッション ポリシーを使用すると、セッションは、セッション ファイルと呼ばれる通常のファイルにマップされます。ユーザーがブラウザを閉じても、セッション ファイルはファイル システムに存在し続けます。おそらく、オペレーティングシステムはセッション ファイルを 1 日 1 回(夜間に) 削除します。

したがって、ユーザーが 1 日後に戻ってきた場合、sessionID Cookie はセッション ファイルを指しますが、このファイルは使用できなくなっている可能性があります

公共PCの場合

さらに、公共の PC で実行されているブラウザーを想像してみてください。ユーザーがブラウザーを閉じて新しいユーザーがログインすると、他のユーザーは自動的にログインします。

于 2013-08-26T22:17:08.980 に答える