PHP フレームワーク Session.php 作成(2)

2018年5月8日

みなさんこんにちは!タカモリです。

今回は前回に引き続いて、Session.phpの続きということでやっていきたいと思います。

srcも結構長いし、前回もコンストラクタしかできてないので、きょうはさっそくsrcを貼っていく。

set()メソッド

前回のコンストラクタでは、セッションidをユーザーに渡し、更にリクエストがユーザーからある度に、そのセッションidを受け取る為の処理を書いていたわけだが、今回のset()メソッドではそのセッションid毎に作られるセッションファイルに値を残す処理ということをやるわけだ。

セッションファイルに値を残す為には、連想配列のようにキーと値をスーパーグローバル変数「$_SESSION」に格納する。この$SESSIONに値を格納することで、画面遷移がwebサイト上必要であっても、次の画面でユーザーからのリクエスト時、セッションIDが同じならこの値を取り出せるという仕組みだ。

このset()メソッドでは、セッションファイルに送る為の[キー]と値を引数として受け、それを$session(セッションファイル)に渡している。

get()メソッド

セッションファイルの仕組みがわかれば、このメソッドは簡単だ。先ほど上でセッションファイルに入力した値を、取りだす為のキーを、このメソッドでは引数として受けて、isset()によりその値があることの確認が取れれば、それを呼び出し元に返している。

remove()メソッド

このメソッドは逆に変数を解除するメソッドだ。引数に受けた[キー]と値をunset()で解除している。

clear()メソッド

このclear()メソッドでは、セッション自体を削除する時に使用すると思われる。セッションファイルに入っている中身を全て削除する為には、このメソッドで実行する通り空の配列を$_SESSIONに代入することで、そのセッションidの全てのセッションファイルのデータが削除される。

regenerate()メソッド

このregenerate()メソッドが今回やるメソッドの中で一番メインとなるメソッドになると思う。通常かどうかわからないが、調べてみるとセッションというのはログインからサインアウトまでを1つのセッションという風にみなすという考え方があるらしい。

前回の記事を見てもらえば分かるのだが、このフレームワークのセッション開始時期はログイン後にセッション開始という形ではなく、このSessionクラスがインスタンス化された時点でsession_start()関数が呼ばれるのだが、このsession_start()関数がインスタンス化されるのはこのフレームワークを利用してユーザーからアクセスがあった時点なのだ。

しかし、セッションidというのは、たまに変更してあげないと悪意を持った人から時に奪われてしまうという事態が発生してしまう。これは「セッションハイジャック」という攻撃の方法で知られているのだが、このセッションハイジャックはログイン後の画面のセッションidをログイン前の時点と変更することで大幅に安全になると言われている。

自分は画面の切換え毎にセッションidを変更することが安全なのではないのかと思っていたので、セキュリティ関係の本やサイトを軽くではあるが調べてみたのだが、どうやらそこまでする必要はないらしい。これについては自分ももう少し勉強していきたいと思う。

話を元に戻すがこのregenerate()メソッドの呼び出し時期はログイン開始時期だ。そしてこのメソッドの処理では、ユーザーに新しくセッションidを発行するsessin_regenerate_id()関数が呼び出されている。この関数の引数にtrueを指定することで、前回使用していたセッションidを破棄することができる。前回のセッションidは残しておいても特に意味がないので、この引数をtrueにすることが推奨されている。

このメソッドでも予め引数にはtrueが入っていることがわかるが、何故変更できる仕様にしているのかは、はっきり言ってわからない笑

そして、このsession_regenerate_id()メソッドについてもsession_start()メソッドと同様2回呼び出されることでエラーを惹き起こしてしまうことから静的メソッドでそれを阻止している。(詳しくは前回の記事参照)

ということで、2回に渡ってsessionクラスについて書いてみたが、実際に使ってみないとどのような挙動をするのかはわからない点もあるという風には感じるものの、システムの複雑さとしてはそこまで難しいものではないとも感じる。

というわけで今回はここまでだ。次回は、今までやったクラスを総まとめするappricationクラスについて書いていきたいと思う。