4

繰り返しの質問で申し訳ありません。このフォーラムでいくつか見たことがありますが、どれもうまくいきませんでした...

私はPHPセッションを使用して基本的なログインを構築していますが、これは初めてです...

login.php は HTML ログイン フォームを検証し、変数を設定してセッションを開始します$_SESSION['login']$_SESSION['id]

次に、有効なログインを必要とする各ページはrequire 'session.php';、変数をチェックし、$_SESSION['valid']適切なログイン変数なしでユーザーをリダイレクトします。問題は、設定したセッション変数のどちらもログアウトすると、設定が解除されないことです。

現在、私の logout.php ファイルは、ほぼすべてのメソッドを使用して、オンラインで見つけることができた変数を破棄しますが、実際にそれを行うものはありません。

そのため、ログアウトしても「プライベート」ページにアクセスできます。

また、注:セッション名を付けて試してみました例:session_start();うまくいかなかったので、今は使用していますsession_start("user");

また、注意してください:私はクッキーを使用していません。

私が言及したファイルは次のとおりです。


login.php


$email=$_POST['email-log']; $pass=$_POST['password-log'];

$i=-1;

do
{$i++; $path="users/".$i.".json";
$file=  file_get_contents($path);
$x=json_decode($file,true);
} while($x['email']!=$email);
$id=$i;
$truepass=$x['pass'];

$errors=0;
$hash=hash('sha256',$pass);
if($hash != $truepass){$errors=$errors+1;}

if($errors==0){
        session_start("user");
        $_SESSION['login']="valid";
        $_SESSION['id']=$id;

    header('Location: loginlanding.php');}

else{header('Location: front.php?error=y');}

session.php


session_start("user"); if($_SESSION['login'] !== "valid") {header('Location: front.php?needto=login');}

logout.php


unset($_SESSION); unset($_SESSION['login']); unset($_SESSION['id']); session_unset("user"); $_SESSION=array(); session_destroy("user"); header('Location: front.php?logged=out');

また、私は一般的にログインが初めてなので、セキュリティを強化するためのアドバイスも大歓迎です. より安全にすることを計画していますが、まずこの基本的な機能を稼働させる必要があります。

4

3 に答える 3

19

あなたは決してすべきではありませんunset($_SESSION)

$_SESSION変数をクリアする最も簡単な方法は$_SESSION = Array();

ただし、次のように繰り返すこともできますunset

foreach(array_keys($_SESSION) as $k) unset($_SESSION[$k]);
于 2012-09-06T01:34:44.213 に答える
13

最初にセッションに対して持っていた唯一の参照を設定解除した後、どれだけ多くのことを試みているかは驚くべきことです。マニュアルから直接:

注意

$_SESSIONで全体を設定解除しないでください。これにより、スーパーグローバルunset($_SESSION)を介したセッション変数の登録が無効になります。$_SESSION

http://php.net/manual/en/function.session-unset.php

設定を解除している$_SESSIONため、スーパーグローバルの他の配列への設定解除$_SESSIONは登録されず、ブラウザーの一時 Cookie に残ります。すべてのセッション変数session_unset()を削除しようとしている場合は、代わりに使用してください。それ以外の場合は、セッション グローバルの設定を解除しないでください。ただし、削除する個々の値の設定を解除してください。

于 2012-09-06T01:36:27.290 に答える