忍者ブログ

からすまる日誌 mySQL

授業ノートのまとめ

応用(19) ログアウト処理

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

応用(19) ログアウト処理

ログアウト処理
 
index.phpに追加
<div class="link"><a href="login.php">ログアウト</a></div><!--リンク先はlogin-->
 
login.phpにも追加するが・・・
 
セキュアなページではログアウトは重要
セッションを開始するとsession idが作られる
サーバーだけでなく、個人の端末の方にもそのid番号だけを書いたクッキーが残る
セッションハイジャックはどこで起こるかというと、セッションの固定化でおこるらしい
いま私たちが書いたコードではセッションIDが変わらない。
クッキーが賞味期限がきれたときだけ。
 
もしクライアント側に以前発行されたクッキーがあれば、
それを再利用しようとする癖がある。
昨日ログインしたときとおなじIDを実は使っている(セッションIDが固定)
昨日どころか1年かも。
 
手動で消されるか賞味期限になるまで固定化されている。
 

setcookieは中身を作る用途にも消す用途にも使える
 
第一引数 クッキーの名前 session_name()とすればいい
第二引数 クッキーの値 空白にすると消える
第3引数 賞味期限(有効期限)削除するときはすぐ消えてほしいので過去を指定する。time関数で
time()-60;
とするとたちまち削除が発生する
 

これが正しいログアウトの処理
 
<?php
session_start();
$_SESSION=[];//セッションデータの中の値を捨てる
setcookie(session_name(),'',time()-60);//こっち側を捨てる
session_destroy();//通信を切る
?>
 
跡形も残らない消し方をしましょう
データの破片を置いておかないように
 

しかもログインをしたときに細工をするといいらしい
ログインするたびにsession idの再発行をしてやるとセキュアになる
 
session_regenerate_id();//毎回変わる。新しい鞄。そのなかに以下のものを入れる。
ログインしたら真っ先に行う
 
場所はauth.phpのここ 
 
--->auth.php
 
<?php
session_start();
//評価するデータが来ているかいないか
if(empty($_POST["u_id"]) || empty($_POST["pass"])){
 header("Location: login.php");
 exit();
}
//DBへ接続
require_once("config.php");
//SQL文
$sql="SELECT * FROM users WHERE u_id=:u_id";//一回全部読んでくる
$stmt=$pdo->prepare($sql);//構文を焼く。こんがり。
$stmt->bindValue(":u_id",$_POST["u_id"],PDO::PARAM_STR);
$stmt->execute();
//FETCH 房をばらして連想配列にするために$rowに入れる
$row=$stmt->fetch(PDO::FETCH_ASSOC);//1件とりだし
//認証処理
if(password_verify($_POST["pass"],$row["pass"])){
 //セッションID の再発行
 session_regenerate_id();//毎回変わる。新しい鞄。そのなかに以下のものを入れる
 $_SESSION["login"] = true;
 $_SESSION["u_id"]=$row["u_id"];//=$_POST["u_id"]でも構わない
 $_SESSION["nickname"]=$row["nickname"];
 header("Location: index.php");//リダイレクト
 exit();
}else{
 $_SESSION["login"]=false;//ログイン失敗
 header("Location: login.php");
 exit();
}
?>
 
--->login.php
 
<?php
session_start();
$_SESSION=[];//セッションデータの中の値を捨てる
setcookie(session_name(),'',time()-60);//こっち側を捨てる
session_destroy();//通信を切る
?>
<!DOCTYPE html>
<html lang="ja">
 <head>
  <meta charset="utf-8">
  <title>ログインフォーム</title>
  <link rel="stylesheet" href="css/style.css">
 </head>
 <body>
  <div id="container">
   <h1>ユーザーログイン</h1>
   <form method="post" action="auth.php">
    <table>
     <tr>
      <th><label for="u_id">ユーザ名</label></th>
      <td><input type="text" name="u_id" id="u_id"></td>
     </tr>
     <tr>
      <th><label for="pass">パスワード</label></th>
      <td><input type="password" name="pass" id="pass"></td>
     </tr>
     
    </table>
    <p><button type="submit">認証</button></p>
    
   </form>
  </div>
 </body>
</html>
 

実際リジェネレートが起こっているか検証で見てみますか
検証→network→index.php→cookie
 
 
毎回違う値になっている
 

ページを分けるときはリミット文でページを分けるらしい
クラスで書けるともっと後々よいらしい。メソッドを使うみたいだ。いずれやるとのこと。
でもphpのいいところは手続き型で書けるところ。これでもいいらしい。
 

PR

コメント

ただいまコメントを受けつけておりません。

プロフィール

HN:
karasumaru
性別:
非公開

P R