LoginSignup
0
0

More than 3 years have passed since last update.

PHP ログイン認証の作成手順⑤ 〜ログイン機能作成②とセッションハイジャック〜

Last updated at Posted at 2021-01-23

今回は
・emailと一致するユーザ検索
・passwordが一致するか検証
・ユーザ情報をセッションに格納してログイン
を実装する

パスワード照会の方法

ユーザ入力とDBの値を照会
しかし、パスワードはハッシュ化されている→照会できる関数がある
password_verify(パス、ハッシュ)
パスワードがハッシュにマッチするかを判定する
マッチしたらtrue、しなかったらfalseを返す

セッションハイジャック対策

セッションIDを盗まれて、なりすましをされること
対策:セッションIDを再作成する

手順

ログインロジック作成

前回までに作成したUserLogicクラスの中にログイン専用のメソッドを作成していく。
loginメソッドとする。
top.phpがログインフォーム後のページだから、ここでログインの処理を記述する。

top.php
<?php

require_once('../classes/UserLogic.php');

session_start();

// エラーメッセージ
$err = [];

// バリデーション
if(!$email = filter_input(INPUT_POST, 'email')){
    $err['email'] = 'メールアドレスを記入してください';
}

if(!$password = filter_input(INPUT_POST, 'password')){
    $err['password'] = 'パスワードを記入してください';
}

if(count($err) > 0){
    // エラーがあった場合は戻す
    $_SESSION = $err;
    header('Location: login.php');
    return;
}
// ログイン成功時の処理
$result = UserLogic::login($email, $password);
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ユーザ登録完了画面</title>
</head>
<body>
<?php if (count($err) > 0) : ?>
<!-- エラーがある場合にforeachで該当エラーを表示させる -->
    <?php foreach($err as $e) : ?>
    <p><?php echo $e ?></p>
    <?php endforeach; ?>
<!-- $err配列に何もない=エラーがない から完了画面を表示させる -->
<?php else: ?>
    <p>ユーザー登録が完了しました。</p>
<?php endif ; ?>
<a href="login.php">戻る</a>
</body>
</html>

$result = UserLogic::login($email, $password);の部分。

そして、そのloginメソッドを以下の通りに記述する。

UserLogic.php
/**
     * ログイン処理
     * @param string $email
     * @param string $password
     * @return bool $result
     */
    public static function login($email, $password)
    {
        // 結果
        $result = false;
        // ユーザをemailから検索して取得
        $user = self::getUserByEmail($email);
    }

emailからユーザ取得ロジック作成

loginメソッドとは別に、emailの照会のためのメソッドを作成する。

UserLogic.php
/**
     * ログイン処理
     * @param string $email
     * @param string $password
     * @return bool $result
     */
    public static function login($email, $password)
    {
        // 結果
        $result = false;
        // ユーザをemailから検索して取得
        $user = self::getUserByEmail($email);
        return $user;
    }

    /**
     * emailからユーザを取得
     * @param string $email
     * @return array|bool $user|false
     */
    public static function getUserByEmail($email)
    {
        // SQLの準備
        // SQLの実行
        // SQLの結果を返す
        $sql = 'SELECT * FROM users WHERE email = ?';

        // ユーザデータを配列に入れる
        $arr = [];
        $arr[] = $email;
        try{
            $stmt = connect()->prepare($sql);
            $stmt->execute($arr);
            //SQLの結果を返す
            $user = $stmt->fetch();
            return $user;
        }catch(\Exception $e){
            return false;
        }

    }

パスワード照会とセッションハイジャック対策

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0