# 【B講座】Webディベロッパー養成講座3回目 ## 初期準備 ## セクション1 本日の授業用DB作成 ### まずはphpMyAdminを開いて授業用のDBを作成する #### 1. MAMPを起動 #### 2. WebStartボタンから起動トップページを表示 #### 3. ページの真ん中MySQLのタブからphpMyAdminのリンクをクリック #### 4. 起動した画面がMySQLを管理するphpMyAdminの画面が表示されます。 #### 5. データベースタブをクリック #### 6. データベースを作成から以下の名前で作成 ``` データベース名:gs_db3 照合順序:utf8_unicode_ci ``` #### 7. 作成ボタンをクリック 左側にgs_db3というデータベースができていると思います。 現在は空っぽです。 ### SQLファイルからデータをインポートしてみよう 〇〇.sqlというSQLファイルをインポートしてデータを作成します。 #### 1. gs_db3を選択した状態でインポートタブをクリック #### 2. ファイルを選択をクリックして配布した資料内のSQLフォルダ内のgs_an_table.sqlを選択 #### 3. 実行してみる #### 4. gs_an_tableが追加されているはずです。 #### 5. 同様にしてgs_user_tableを作成 ## セクション2 SESSION基礎 SESSION変数は「サーバー側に変数を保持」することができる技術です。 これまでの変数と違いサーバー側に保存されているので変数値を別のファイルで呼び出すことができます。 ### SESSIONを使ってみよう #### 1.session01.phpに以下を記述 ``` <?php // SESSIONスタート session_start(); // SESSIONのidを取得 $sid = session_id(); echo $sid; ?> ``` #### 2.session01.phpをブラウザでチェック idが表示されているはずです。 このデータはブラウザからどこに保存されているかチェックできます。 `検証>Application>Cookies>localhost` の中にデータがあります。 #### 3.session01.phpのsession_id()の次に以下の処理を追加 ``` // SESSION変数にデータを登録 $_SESSION["name"] = "中野"; $_SESSION["age"] = 26; ``` #### 4.session02.phpでSESSION変数に預けたデータを取得 ``` // SESSIONスタート session_start(); // SESSION変数を取得 $name = $_SESSION["name"]; $age = $_SESSION["age"]; echo $name; echo $age; ``` #### 5.session_regenerate_id.phpの以下の部分に処理追記 `session_regenerate_id(true);//trueが大事!!` #### 6.session_regenerate_id.phpをブラウザでチェック ずっと同じsession_idだとセキュリティ的に危険なのでリジェネレイトします。 ## セクション3 ユーザー認証の実装 login.phpからlogin_act.phpでログイン処理を経由して判定。ログインユーザーならばselect.phpに遷移、違う場合はlogin.phpにリダイレクト ### ログイン処理を実装 ユーザー情報があったらsession_idをSESSION変数に保存。つまりsession_idがあるのはログインユーザー #### 1.login_act.phpに以下の記述を追加 ``` //最初にSESSIONを開始!!ココ大事!! session_start(); //POST値 $lid = $_POST['lid']; $lpw = $_POST['lpw']; ``` #### 2.SQLを準備 ``` //2. データ登録SQL作成 $stmt = $pdo->prepare("SELECT * FROM gs_user_table WHERE lid = :lid AND lpw=:lpw"); $stmt->bindValue(':lid', $lid, PDO::PARAM_STR); $stmt->bindValue(':lpw', $lpw, PDO::PARAM_STR); //* Hash化する場合はコメントする $status = $stmt->execute(); ``` #### 3.処理後のリダイレクト先を設定 ``` //5. 該当レコードがあればSESSIONに値を代入 //* if(password_verify($lpw, $val["lpw"])){ if( $val['id'] != "" ){ //Login成功時 $_SESSION['chk_ssid'] = session_id(); $_SESSION['kanri_flg'] = $val['kanri_flg']; $_SESSION['name'] = $val['name']; redirect('selsect.php'); }else{ //Login失敗時(Logout経由) redirect('login.php'); } ``` #### 4.funcs.phpにログインチェック関数を作成 ``` //ログインチェック function loginCheck(){ if( $_SESSION['chk_ssid'] != session_id() ){ exit('LOGIN ERROR'); }else{ session_regenerate_id(true); $_SESSION['chk_ssid'] = session_id(); } } ``` #### 5.select.phpにログインチェック処理を追加 ``` //SESSIONスタート session_start(); //関数を呼び出す require_once('funcs.php'); //ログインチェック loginCheck(); //以下ログインユーザーのみ ``` *これでselsect.phpはログインユーザーでないと見れないページになりました。 #### 6.その他ログインユーザーしかアクセスできないページを設定 detail.phpとdelete.phpのアンケートの管理機能はログインユーザーのみにしたいのでそれぞれのファイルにログインに関する処理を追加 ### ログアウト処理 ログアウトの流れはSESSION変数を初期化してCookieに保存してある"SessionIDの保存期間を過去にして破棄 #### 1.logout.phpに処理が記述されているのでindex.phpのheaderを変更 ``` <header> <nav class="navbar navbar-default"> <div class="container-fluid"> <div class="navbar-header"><a class="navbar-brand" href="select.php">データ一覧</a></div> <div class="navbar-header"><a class="navbar-brand" href="login.php">ログイン</a></div> <div class="navbar-header"><a class="navbar-brand" href="logout.php">ログアウト</a></div><!-- ここを追記 --> </div> </nav> </header> ``` #### 2.ログアウトボタンをブラウザでクリック アンケート一覧にアクセスするともう見ることはできなくなっているはずです。 ## セクション4 パスワードのハッシュ化 ### パスワードは基本的にハッシュ化(暗号化)して利用する。平文では使わない #### 1.hash.phpを作成 #### 2.hash.php内にパスワードのハッシュ化の処理を記述 ``` <?php $pw = password_hash('test1',PASSWORD_DEFAULT); echo $pw; ?> ``` #### 3.login_act.phpの中の処理を一部変更 ``` //2. データ登録SQL作成 $stmt = $pdo->prepare("SELECT * FROM gs_user_table WHERE lid = :lid);//ここをlidだけに変更 $stmt->bindValue(':lid',$lid, PDO::PARAM_STR); // $stmt->bindValue(':lpw',$lpw, PDO::PARAM_STR); //* Hash化する場合はコメントする $status = $stmt->execute(); ``` ``` //5. 該当レコードがあればSESSIONに値を代入この部分のif文をpassword_verifyに変更 if( password_verify($lpw, $val["lpw"]) ){ //Login成功時 省略 }else{ 省略 } ```