SESSION管理(PHP)

更新日2012-04-14 (土) 14:43:43

PHPでSESSION管理を利用して、認証ページで認証を受けてた後、Webブラウザを
終了するまで、その認証を有効にするサンプル。

SESSION IDは/tmpにDefaultでは作成されるが、関数で

  session_save_path("/var/hoge/php");

と指定することも出来る。(session_start();の前に記述)セキュリティてきにはこちらが良い。

また、php.iniで

  session.save_path = /var/hoge/php

と指定すればシステム全体で指定できる

SESSIONを発行すると、SESSION IDが発行される。これは16進の文字列で
これを、次のページに渡す。この16進の文字列のファイルが/tmpに出来るが、
その中に、session_register("[変数名]")で定義された変数名が格納される。
$_SESSION['変数名'] = 変数で変数を代入する。

 次のページには16進のSEESION IDを渡す。以降$_SESSION['変数名']で参照
出来るようになる。ただしこれらのことを行うページの一番初めで定義の必要あり

<?php
  session_start();
  session_name("login");
  session_register("user_id");
 //headの文字コードしてはタグ<head>はうまくいかないので以下のようにする
  header("Content-type: text/html;charset=EUC-JP");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<TITLE> test</TITLE>
</head>
<body>
------
------

が必要になる。

このsession_nameが先ほどの16進数と関連づけらるので、実際の16進数が何であるか 意識しなでプログラムが作成できる。
セッション名は,無指定では PHPSESSID という文字列になるが session_nameでセッション名を設定することができる。
これによりセキュリティが向上するらしいがそこがよくわからない。

/tmpのSESSION IDは

# more sess_60167428a222eaaeafc965ca138ff0c7
user_id|s:5:"abcde";
session_register名|sはString:文字数:session_registerの内容かな?

のようになっている。

ただし、SESSION IDが盗まれると簡単になりすましにあうので注意。

[参考]

URLのパラメータとしてGETメソッドでセッションIDを渡には Cookieが使用できない場合は php.iniの

session.use_trans_sid = 1

にする

SESSION IDを渡すのに(通常は以下のようなことをしなくても渡される)

printf("<A HREF = \"next2.php?%s\">2ページ目へ</A>
<BR>",strip_tags(session_id()))

のようにするとSIDが表示されるが

printf("<A HREF = \"next2.php?%s\">2ページ目へ</A> <BR>",strip_tags(SID))

のようにsession_id()をSIDにすると表示されないで渡せる

このときクッキーが有効のときはリロードすると
SIDという特殊な変数はprintf や echoで表示できない。
(一度目は、クッキーを食べさていないので、表示する)
また、クッキーが有効のときは?以下の変数としてSIDを渡す必要がない

printf("<A HREF = \"next2.php\">2ページ目へ</A>")

でよい。

サンプルプログラム

login.html ----認証用のユーザ名とパスワードの入力
check.php ----認証確認とSESSIONの発行
next.php  ----認証後閲覧できるページ1(次のページへの移動を
              アンカーとボタンでの例)
next2.php ----認証後閲覧できるページ2(next.phpからのアンカー指定先)
next3.php ----認証後閲覧できるページ3(next.phpからのボタンでの指定先)

認証が成功すると$_SESSION['user_id']にユーザ名を入れ
以降のページでは$_SESSION['user_id']が存在するか否かで認証
されたか否かを判断している。

・login.html

<html>
<form action="check.php" method="post">
<p>UserName:<input type="text" name="id"> <BR>
<p>Password:<input type="password" name="passwd"> <BR>
<BR>

<input type="submit" value="OK">

</form>

</html>

・check.php

<?php
  session_start();
  session_name("login");
  session_register("user_id");
  header("Content-type: text/html;charset=EUC-JP");
?>

<H2> 認証画面 </H2>
<!--
以下はアンカーを利用して次のページにジャンプ
-->

<?php

if($_POST['id'] == "abcde" && $_POST['passwd'] == "123"){
        echo "認証確認ができました。<BR>";
//通常はURLの変数やPOSTを指定する必要がない
        printf("<A HREF = \"next.phps\">次のページへ</ A><BR>");

//        printf("<A HREF = \"next.php?%s\">次のページへ</
A><BR>",strip_tags(SID));
        $_SESSION['user_id'] = $_POST['id'];

?>
<!--
以下はボタンを利用して次のページにジャンプ
-->
       <form action="next3.php" method="post">
//通常はURLの変数やPOSTを指定する必要がない
       <form action="next3.php?<?php echo strip_tags(SID)?>" method="post">
       <input type="submit" value="Page 3">
       </form>
 

<?php

}else{
        echo "認証失敗!! <BR>";
        exit;
}

?>

・next.php

<?php
  session_start();
  session_name("login");
// セッションIDの変更(毎回ページ移動で変更することでセキュリティアップ)
//この内容もヘッダー部に記入する必要あり。
// 現ID取得
       $oldsessid = session_id();
// 変更
       session_regenerate_id(True); //True指定で古いIDを削除(PHP5.1以降)
// 新ID取得
       $newsessid=session_id();

  header("Content-type: text/html;charset=EUC-JP");
?>
<H1> 秘密のページ </H1>

<?php
if (isset($_SESSION['user_id'])){
        echo "{$_SESSION['user_id']} <BR>";
        echo "このページをご覧ください <BR>";
//通常はURLの変数やPOSTを指定する必要がない
        printf("<A HREF = \"next2.php\">2ページ目へ</A></BR>");

//         printf("<A HREF = \"next2.php?%s\">2ページ目へ</A>
 <BR>",strip_tags(session_id()));
        printf("Session Name %s <BR>",session_name());
        printf("Session ID %s <BR>",session_id());

}else{
        echo "認証されていません!! <BR>";
}

?>

・next2.php

<?php
  session_start();
  session_name("login");
  header("Content-type: text/html;charset=EUC-JP");
?>
<H1> 秘密のページ2 </H1>

<?php
if (isset($_SESSION['user_id'])){
        echo "{$_SESSION['user_id']} <BR>";
        echo "このページをご覧ください <BR>";

}else{
        echo "認証されていません!! <BR>";
}

?>

・next3.php

<?php
  session_start();
  session_name("login");
  header("Content-type: text/html;charset=EUC-JP");
?>
<H1> 秘密のページ3 </H1>

<?php
if (isset($_SESSION['user_id'])){
        echo "{$_SESSION['user_id']} <BR>";
        echo "このページをご覧ください <BR>";

}else{
        echo "認証されていません!! <BR>";
}

?>

・logout

//セッション解除  
 session_unregister("user_id");
// セッション変数を全て解除する <=すべて解除されるため他のマシンからのloginも消される。
// $_SESSION = array();
// 最終的に、セッションを破壊する
 session_destroy();

//以下のクッキー[PHPSESSID]がある可能性があるので削除する

if (isset($_COOKIE["PHPSESSID"])) {
//クッキーを削除するためには、有効期限を昔の時間に設定することで削除します。例えば下記の ようにします。 
//time() - 180
    setcookie("PHPSESSID", '', time() - 1800, '/');
}else{
    echo "PHPSESSID Cookieはない";
}

注意

ユーザidなどはmd5でハッシュしとくと安全だか、md5()は今は危ないようだ。sha1()を利用するほうが安全。



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-04-14 (土) 14:43:43 (2232d)