login機能作成を何度も行なっているが、つまりやすい部分について解説する
login.php
session_start(); //セッションスタート
require_once('common/function.php'); //commonファイルのfunction.phpを接続する
if(!isset($_SESSION['csrf_token'])) { ///csrf_token変数に値が入っているかどうかを確認するためのisset関数
$_SESSION['csrf_token'] = random(); //ランダムにsessionが変わるごとにcsrf_tokenが発行される。
}
<form class="login-container" method="POST" action="login_act.php">
<p><input type="text" name="account" placeholder="Id"></p>
<p><input type="password" name="password" placeholder="Password"></p>
<p><input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']?>"></p> <!-- csrf_tokenを送る -->
<p><input type="submit" value="Log in"></p>
</form>
login_act_php
<?php
//最初にSESSIONを開始!!ココ大事!!
session_start(); //セッションスタート
require_once('common/function.php'); //commonファイルのfunction.phpを接続する
if(!isset($_SESSION['csrf_token'])) { ///csrf_token変数に値が入っているかどうかを確認するためのisset関数
$_SESSION['csrf_token'] = random(); //ランダムにsessionが変わるごとにcsrf_tokenが発行される。
}
//データベース接続したものを$pdoに入れる(function.phpにあり)
$pdo = db();
// ①新規作成 start このページにアクセスしたら、
// ポストデータを取得する。
if(isset($_POST["account"]) || isset($_POST["password"]) || isset($_POST["csrf_token"])) { //変数に値が入っているかどうかを確認するためのisset関数
if($_POST['csrf_token'] !== $_SESSION['csrf_token']) { //csrf_tokenと$session[csrf_token]が一致しないなら
echo "このサイト以外からのアクセスは禁止しています。"; //このサイト以外からのアクセスは禁止しています。を出力する。
exit; //終了
}
$account = $_POST["account"]; //$idを受け止める
$password = $_POST["password"]; //$passwordを受け止める
try {//try〜catchすることができる。
//途中で何かしらのエラーが起こしたら、その場で処理が止まって、catchより以下がエラーで返却される。
//catchされず、滞りなく進むとそのままで良い
// トランザクション開始(ロック)...何かの処理をひとまとめにした状態で、何か処理をする中で処理が失敗した場合に最初からやり直すという意味
// 「データを登録」「デルウータを更新」「データ削除」などのデータの内容変更がある場合にトランザクションを使用する
$pdo->beginTransaction();
// データを登録するSQL
$stmt = $pdo->prepare("SELECT * FROM users WHERE account = :account");
// 値をセット
// バインドパラムでセットする
$stmt->bindParam(':account', $account, PDO::PARAM_STR);
// SQL実行
$res = $stmt->execute();
$user = $stmt->fetch(PDO::FETCH_ASSOC);
// コミット
if( $res ) {
$pdo->commit();
}
//ここでトランザクション終了。
} catch(PDOException $e) {
// エラーメッセージを出力
echo $e->getMessage();
// ロールバック
$pdo->rollBack();
}
//5. 該当レコードがあればSESSIONに値を代入
if( password_verify($password ,$user["password"])){ //password_verify指定したハッシュがパスワードにマッチするかどうかを調べます。
//Login成功したら、session_id,name,brithなどを持たせてwait_ad_list.phpへ
$_SESSION["chk_ssid"] = session_id(); //自分のsession.ID
$_SESSION["id"] = $user['id']; // idを持たせる
$_SESSION["name"] = $user['name']; //nameを持たせる
redirect("wait_ad_list.php");
}else{
echo "login情報が違っています。";
}
exit();
}
?>
1.login.phpの「session start」が入っているか確認。
2.login_act.php「」の「password_verify」で詰まりやすいので注意
エラーになった場合は、直前の行で、
「var_dump();」で変数に自分の想定しているものが入っているか確認する
3. ,$user["password"]が「var_dump();」ハッシュ化されているか確認
ハッシュ化されていない場合は、ハッシュ化する