PHPで単一ページに簡単なログイン処理を導入する

PHPで単一のページで、他のページへ移動することがないようなケースでログイン認証をデータベースを使わずに実装する簡単な方法です。例えば、自分しか見ることが出来ないような管理画面や情報があるページにログイン認証を掛けます。
PHPで簡単なログイン処理を実装する
ログインにはIDとPASSWORD、そして簡単な計算の答えを入れることでログイン出来るようにします。
とりあえずログイン処理全体の内容はこのようになります
<?php
header("Content-type: text/html; charset=utf-8");
//パスワードとIDを設定
define("ID" , "root");
define("PASSWORD" , "abcd");
$post_id = @$_POST["id"];
$post_password = @$_POST["password"];
$val1 = @$_POST["val1"];
$val2 = @$_POST["val2"];
$val3 = @$_POST["val3"];
$mass = $val1+$val2;
if($post_id == ID && $post_password == PASSWORD && $mass == $val3) {
echo "<p>ログイン成功!!</p>";
} elseif (!@$_POST) {
login_form();
} else {
if($mass == $val3) {
echo "<p>ログイン失敗 ID又はPASSWORDが間違っています</p>";
} else {
echo "<p>ログイン失敗 計算の答えが間違っています</p>";
}
login_form();
}
/**************************************************
** ログインフォームの表示 **
**************************************************/
function login_form() {
$rand1 = rand(0,9);
$rand2 = rand(0,9);
echo <<<LOGINFORM
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<form action="" method="post" id="login">
<input type="text" name="id" placeholder="id">
<input type="password" name="password" placeholder="password">
<input type="text" name="val1" style="display:none;" value="{$rand1}">
<input type="text" name="val2" style="display:none;" value="{$rand2}">
<input type="text" name="val3" placeholder="{$rand1}+{$rand2}=の答えを入力">
<input type="submit" value="ログイン">
</form>
</body>
</html>
LOGINFORM;
}
IDとPASSWORDを設定する
//パスワードとIDを設定
define("ID" , "root");
define("PASSWORD" , "abcd");
まず、ログインに使うIDとPASSWORDを設定します。defineでIDとPASSWORDに値を入れます、今回のサンプルでは IDがroot、PASSWORDがabcdとしてます。
ログインフォームを作成する
function login_form() {
$rand1 = rand(0,9);
$rand2 = rand(0,9);
echo <<<LOGINFORM
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<form action="" method="post" id="login">
<input type="text" name="id" placeholder="id">
<input type="password" name="password" placeholder="password">
<input type="hidden" name="val1" value="{$rand1}">
<input type="hidden" name="val2" value="{$rand2}">
<input type="text" name="val3" placeholder="{$rand1}+{$rand2}=の答えを入力">
<input type="submit" value="ログイン">
</form>
</body>
</html>
LOGINFORM;
}
ログインするためのフォームです。フォームには IDのinput、PASSWORD用のinput、計算結果用のinput、後は隠しのinputです。ひと目にはつかないのですが、HTML中に隠し要素が現れているので 計算の問題のところは、数字を文字列に割り振るなどして暗号化し計算させるための数字を画像等で用意して表示させるのが望ましいと思いますが、今回は簡易的に
フォームで送られてきた値を元にログイン処理
$post_id = @$_POST["id"];
$post_password = @$_POST["password"];
$val1 = @$_POST["val1"];
$val2 = @$_POST["val2"];
$val3 = @$_POST["val3"];
$mass = $val1+$val2;
if($post_id == ID && $post_password == PASSWORD && $mass == $val3) {
echo "<p>ログイン成功!!</p>";
} elseif (!@$_POST) {
login_form();
} else {
if($mass == $val3) {
echo "<p>ログイン失敗 ID又はPASSWORDが間違っています</p>";
} else {
echo "<p>ログイン失敗 計算の答えが間違っています</p>";
}
login_form();
}
フォームで送られてきた値をPOSTで取得し、その内容が正しいかをチェックします。ID、PASSWORD、計算結果の3つが正しい時にはログイン成功と表示します。それ以外の場合で計算結果が正しいがIDかPASSWORDが間違っている時の表示、計算結果が間違っている時の表示と振り分けます。
ログイン成功のところに、ログイン後に表示したいコンテンツを入れればログイン後の表示となります。例えば、他にログイン後に表示したいものをPHPファイルで作っておき includeで呼び出したり。関数にしておいて呼び出すなどとすれば使い勝手がいいかと思います。


COMMENT