WebTecNote

[php] パスワード認証ログインシステムのサンプル

パスワードフィールドに入力された文字列を設定されたパスワードと照合し、一致していたらログイン後画面に飛ばす
簡単なログイン処理のサンプルソースです。
CookieとSession両方晒しておきます。

phpファイルを二つ用意しますが、便宜的に

としています。

先頭行にパスワードを設定する定数がありますが、
ファイル数の多いスクリプトではconfig.phpなどを作ってincludeすることが多いです。

ログイン処理の流れは大体こんな感じです。

  1. パスワードフィールドに文字列入れて送信
  2. 送信された文字列が設定されたパスワードと一致するか確認
  3. 一致していたらクッキー、またはセッションに暗号化したパスワードを保存して次のページへ遷移
  4. 一致していなかったらエラーメッセージを出す

ログアウト処理について追記しました

Cookie版

login.php

<?php
define("PASSWORD", "pass");
if(isset($_POST&#91;"action"&#93;)&&$_POST&#91;"action"&#93;==="login"){//POSTされたactionの値がloginだったら
	
	if(PASSWORD=== $_POST&#91;"password"&#93;){//パスワード確認
		setcookie("TEST", md5(PASSWORD));//暗号化してクッキーに保存
		header("Location:admin.php");//admin.phpに飛ばす
		
	}else{
		setcookie("TEST", "", time() - 3600);//時間を過去に設定してクッキーを削除
		message();//エラー表示
	}
}
?>
<?php
function message(){
	print "パスワードが違います";
}
?>
<form action="" method="post"><input name="password" type="text" value="pass" /><input name="action" type="submit" value="login" /></form>

admin.php

<?php
define("PASSWORD", "pass");
if(isset($_COOKIE&#91;"TEST"&#93;) && $_COOKIE&#91;"TEST"&#93; != null && md5(PASSWORD) === $_COOKIE&#91;"TEST"&#93;){//クッキーの値がパスワードと一致するか確認
	print "Login success";
		
}else{
	print "Login false";
}
?>

セッション版

login.php

<?php
define("PASSWORD", "pass");
session_start();
if(isset($_POST&#91;"action"&#93;)&&$_POST&#91;"action"&#93;==="login"){
	
	if(PASSWORD === $_POST&#91;"password"&#93;){//パスワード確認
		$_SESSION&#91;"TEST"&#93; = md5(PASSWORD);//暗号化してセッションに保存
		header("Location:admin.php");
		
	}else{
		session_destroy();//セッション破棄
		message();
	}
}

?>
<?php
function message(){
	print "パスワードが違います";
}
?>
<form action="" method="post"><input name="password" type="text" value="pass" /><input name="action" type="submit" value="login" /></form>

admin.php

<?php
define("PASSWORD", "pass");
session_start();
if(isset($_SESSION&#91;"TEST"&#93;) && $_SESSION&#91;"TEST"&#93; != null && md5(PASSWORD) === $_SESSION&#91;"TEST"&#93;){
	print "Login success";
		
}else{
	session_destroy();//セッション破棄
	print "Login false";
}
?>

うっかりsession_start()抜けてたの修正

setcookie()もsession_start()もブラウザに何か出力を行う前にコールする必要があります。
<?phpの上に空白行があるだけでもエラーになるので要注意。

ハッシュ化する関数はmd5のほかにsha1があります。

「次回からは自動的にログイン」追加編はこちら

ログアウト処理

このサンプルでのログイン条件は、「SessionまたはCookieに保存されている値が暗号化されたパスワードと一致しているか」です。
なのでログアウトしたい場合には、その保存されているSessionやCookieを破棄した上でトップにリダイレクトすればいいということになります。

まずはボタン。nameをlogoutとしときます。(共通)

<form action="" method="post">
<p><button type="submit" name="logout">ログアウト</button></p>
</form>

admin.phpに追加する処理。

Cookie版

やる事はログイン失敗時の処理と同じです。

if(isset($_POST['logout'])){
    setcookie("TEST", "", time() - 3600);
    header("Location:index.php");
}

Session版

マニュアルそのままです。

if(isset($_POST['logout'])){

// セッション変数を全て解除する
$_SESSION = array();

// セッションを切断するにはセッションクッキーも削除する。
// Note: セッション情報だけでなくセッションを破壊する。
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

//セッションを破壊してリダイレクト
session_destroy();
header("Location:index.php");
}
モバイルバージョンを終了