Webアプリ、Webサービスを作成する時に必須なのが、ログイン処理。
今回はそのログイン処理をサンプルコードも交えて紹介します。
ログインにはセッション情報を使用する
ログイン処理にはセッション情報を使用します。
セッション情報はクッキーと混同される場合が多いですが、セッション情報はサーバー側にクッキーはクライアント側に保存されます。
そのため、一般的にクッキーよりセッションのほうがセキュリティが高いとは言われていますが、「セッションハイジャック」という攻撃もあるので、クッキーよりは安全性が高いというレベルでしかないと思っていたほうが良いです。
そのセッション情報を使用するにはPHPのコードの先頭(HTMLコードよりも上)にコードを1行書くだけで使用することができます。
1 2 |
// セッションを開始 session_start(); |
この1行を書くだけでセッション情報を使用することができるようになります。
実際にはクッキーにセッションID保存されて、サーバー側も同じセッションIDを保持して、そのセッションIDをもと情報をやり取りすることが許可されることになります。
そのやりとりする情報が「$_SESSION」変数になります。
ちなみにクッキーに保存されているセッションIDはデベロッパーツールで確認できます。
$_SESSIONとは
$_SESSIONとは$_POSTと同じでPHPのスーパーグローバル変数になります。
スーパーグローバル変数はPHP全体を通して全てのスコープで使用可能な変数になります。
ログイン時のサンプルコード
こんな感じの普通のログイン画面のサンプルコードを下記します。
usersテーブルの構成は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<?php session_start(); // フォームが送信された場合 if (!empty($_POST)) { // フォーム入力値を取得 $email = $_POST['email']; $password = $_POST['password']; // データベース接続は別ファイルで行っっている前提 // データーベースから入力されたユーザーを検索 $sql = "SELECT * FROM users WHERE email = :email AND password = :password"; $stmt = $dbh->prepare($sql); $stmt->bindValue(':email', $email); $stmt->bindValue(':password', sha1($password)); $stmt->execute(); $user = $stmt->fetch(); // ユーザーが見つかればログインOK if ($user) { // $_SESSIONにログインしたユーザーIDを保持 $_SESSION['id'] = $user['id']; // メールアドレスを記憶させる場合 if ($_POST['save'] === 'ON') { // クッキーにメールアドレスを保持 setcookie('email', $email, time()+60*60*24*14); } // ログイン後の画面に遷移 header('Location: index.php'); } else { // ログインNG $error['login'] = "failed"; } } ?> |
要は入力された認証情報とデータベースの情報を照合して、照合できたら$_SESSIONにIDを保存してページ遷移する。
これだけです。
$_SESSIONのキー値は任意のもので構いません。
ログインしていないと操作できないページについて
ログインしていないと操作できないページがあるかと思います。
そういった場合でもきちんとログイン情報をきちんと管理していないとURLを直接入力させるとログインせずに操作ができることになってしまいます。
これを防ぐために、ログインしていないと操作できないページについては以下のような対応が必要です。
1 2 3 4 5 6 7 8 9 10 |
session_start(); // ログイン済みかチェック if (isset($_SESSION['id'])) { // ログイン済み ユーザーID取得 $userId = $_SESSION['id']; } else { // ログインしていない場合はログイン画面へ header('Location: login.php'); } |
このように$_SESSIONにIDがセットされていない場合はログイン画面に強制的にページ遷移させるようにします。
これでログインしていないと操作できないページのURLを直接入力された場合の対策ができました。
ちなみに$_SESSIONを使用する場合は必ず「session_start()」を記述しなければならないことに注意してください。
「session_start()」はセッションIDの設定と、セッションIDの確認の両方に使用されるためです。
ログアウト処理
最後にログアウト処理です。
ログアウトはログイン時に作成したセッションIDの削除を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php session_start(); // $_SESSION(セッション変数を)空にする $_SESSION = array(); // セッション情報のクッキーが存在する場合 if (ini_set('session.use_cookies')) { // クッキーに保存されているセッション情報を削除(クライアント側のセッションIDの削除) setcookie(session_name() . '', time() - 42000); } // セッションを破棄する(サーバー側のセッションIDの削除) session_destroy(); // クッキーに保存したメールアドレスを削除 setcookie('email', '', time()-3600); // ログイン画面へ header('Location: login.php'); exit(); ?> |
クッキーを削除する際に「time() – 42000」、「time() – 3600」などと買いているが、ここはクッキーの保持期間を設定する箇所で、現在であるtime()から値を引くことで過去の時間にして確実に削除しています。
別にtime()から引く値は42000や3600でなくても良いと思います。
まとめ
いかがだったでしょうか。
今回はPHP(ピュアPHP)でログイン、ログアウトする仕組みをサンプルコードを紹介しました。
重量なポイントは以下の通りです。
- ログイン情報はセッションを使用して保存する
- セッション情報を使用する場合はHTMLコードよりも先に「session_start()」を記述する
- ログインしていないと操作できないページのURLを直接指定された場合の対応も忘れずに行う
- ログアウトは「セッション変数のクリア」「クライアントのセッションID(クッキー)のクリア」「サーバーのセッションIDのクリア(session_destroy()」を行う
現在はLaravelなどのフレームワークを使用してWebアプリを作ることが多いでしょうが、PHP(ピュアPHP)でもきちんとログイン処理を作成できるようにしておきましょう。