phpユーザ認証プログラム

| コメント(0) | トラックバック(0)

phpによるログインプログラムです。
ソースコードにて公開します。

>>実行デモ

>>サンプルファイルダウンロード

ファイル構成
 index.php ログイン画面
 admin.php 管理画面 パスワードを設定
 user.php ユーザ画面
 user.ini.php パスワード情報を記述

※パスワード情報はuser.ini.phpに暗号化されずに記載されています。
iniファイルをphpにしてコメントアウトすることにより、ブラウザでは表示されないようになっていますが、何らかの方法でダウンロードされるとパスワードが丸見えになってしまいます。
 セキュリティを要する場合には、暗号化して記述するように改造してください。

index.php
<?php
//
// +----------------------------------------------------------------------+
//pa_auth
// +----------------------------------------------------------------------+
//@package pa_auth 0.1(beta) 2010/8/9
//@author Studio PhotoArtisan
//@copyright 2010 Studio PhotoArtisan
//


$userini = parse_ini_file('user.ini.php');//iniファイル読み込み
$msg="";//メッセージを一旦空に
setcookie("PASS", "", time() - 3600);//ログイン情報を空に


if(isset($_COOKIE["msg"])){//COOKIEにメッセージがある場合は$msgに格納
$msg='<div class="error">'.$_COOKIE["msg"].'</div>';
setcookie("msg", "", time() - 3600);//COOKIE内メッセージを空に
}

$id=$_COOKIE["ID"];//COOKIEにIDがある場合は$idに格納




if(isset($_POST["id"])){//POSTされた場合
	$id=$_POST["id"];//IDを$idに格納
	setcookie("ID",$id);//COOKIEにIDを格納
	
	
	if( $id=='admin'){//idがadminの場合
		if( $userini[admin]=== $_POST["password"]){//管理者パスワードを照合
			setcookie("PASS", md5($_POST["password"]),time() +30);//パスワードをCOOKIEに格納(期限付き)
			header("Location:admin.php");//admin.phpに移動
		}
		else{//管理者パスワードの照合に失敗した場合
			$msg='<div class="error">管理者パスワードが違います。</div>';//エラーメッセージを$msgに格納
		}
	}
	elseif( $userini[$id]=== $_POST["password"]){//IDとパスワードを照合
			setcookie("PASS", md5($_POST["password"]),time() +30);//パスワードをCOOKIEに格納(期限付き)
			header("Location:user.php");//user.phpに移動
		}

	else{//IDとパスワードが照合できなかった場合
		$msg= '<div class="error">IDとパスワードが一致しません。</div>';//エラーメッセージを$msgに格納
	}
}



//$html_headderを設定
$html_headder='<?xml version="1.0" encoding="UTF-8"?>
	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
	<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<meta http-equiv="Content-Script-Type" content="text/javascript" />
	<link rel="stylesheet" href="style.css" type="text/css" />
	<title>管理画面</title>
	</head>';


//$contentsを設定
$contents = '<body><h1>ログイン</h1>
<hr /><div class="txt">ID、パスワードを入力してください。</div>';


//$msgが空ではない場合
if($msg != NULL){
	$contents .=  '<div id="msg">'.$msg.'</div>';//メッセージを挿入
}


//ログインフォーム
$contents.='<form action="" name="logon" method="post">
ID:<input name="id" type="text" value="'.$id.'"/><br />'; //valueに$idを表示
	
//パスワード入力欄
$contents.= 'パスワード:<input name="password" type="password" /><br />';

//送信ボタン
$contents.= '<input type="submit" value="logon" /></form>';

	
//現在の管理者パスワード表示
//デモ用です。本番では必ず削除してください。
$contents.='管理者ID:admin<br />現在の管理者パスワード:'.$userini[admin];


//$footerを設定
$footer='<hr /><div class="copy">Copyright(c)2010 <a href="http://photoartisan.jp">Studio PhotoArtisan</a></div>
</body></html>';



//html出力
echo $html_headder;
echo $contents;
echo $footer;

?>
user.ini.phpに書き込まれたパスワード情報を$useriniに読み込み、POSTされたID、パスワードと照合します。
照合できた場合はパスワードをmd5で暗号化しCOOKIEに保存し、admin.phpとuser.phpに振り分けます。
このスクリプトは期限切れをわかりやすくするため、COOKIEの有効期限を30秒に設定しています。
実際に使用する際には、
setcookie("PASS", md5($_POST["password"]),time() +30);
の+30の部分を、もう少し長い時間に設定してください。

デモ用に現在の管理者パスワードを表示するようになっています。
必ず
$contents.='管理者ID:admin<br />現在の管理者パスワード:'.$userini[admin];
の部分を削除してください。

admin.php
<?php
//
// +----------------------------------------------------------------------+
//pa_auth
// +----------------------------------------------------------------------+
//@package pa_auth 0.1(beta) 2010/8/9
//@author Studio PhotoArtisan
//@copyright 2010 Studio PhotoArtisan
//

$userini = parse_ini_file('user.ini.php');//iniファイル読み込み

$msg ="";//メッセージを一旦空に
setcookie("msg", "", time() - 3600);//COOKIE内メッセージを空に


if(isset($_COOKIE["PASS"]) && md5($userini['admin']) == $_COOKIE["PASS"]){//COOKIEの認証情報を確認
	if (isset($_POST['adminpass'])) {//POSTされた場合
	$userini="";//$useriniを空に
	$userini['admin'] = $_POST['adminpass'];//$useriniにadminパスワードを格納
	
	
	foreach($_POST['username'] as $key => $val){//$_POST['username']を展開
	if($val !=NULL && $_POST['userpass'][$key]!=NULL){//空欄以外がPOSTされた場合
	$userini[$val] = $_POST['userpass'][$key];//$useriniにuserパスワードを格納
	}
	}
	
	
	$fp = fopen('user.ini.php', 'w');//user.ini.phpをfopen
	flock($fp,LOCK_EX) ;//排他ロック
	fputs($fp, "<?php /*\n");//一行目にphpのコメントとして記述
	foreach ($userini  as $key => $val){//$useriniを展開
		fputs($fp, $key."=".$val."\n");//一行ずつ記述
		}
	fputs($fp, "*/ ?>");//最終行にコメント終了を記述
	fclose($fp);//user.ini.phpを閉じる
	
	
	$msg ='IDを設定しました。<br />';//メッセージを$msgに格納
		
	setcookie("PASS", md5( $userini['admin']),time() +30);//パスワードを変更したので、C00KIEを再設定
			
	}
	
	
	//html_headderを設定
	$html_headder='<?xml version="1.0" encoding="UTF-8"?>
	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
	<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<meta http-equiv="Content-Script-Type" content="text/javascript" />
	<link rel="stylesheet" href="style.css" type="text/css" />
	<title>管理画面</title>
	</head>';

	//$contentsを設定
	$contents =  '<body><h1>ログインID一覧</h1><a href="index.php">ログアウト</a><br />';
	

	//$msgが空ではない場合
	if($msg != NULL){
	$contents .=  '<div id="msg">'.$msg.'</div>';//メッセージを挿入
	}
	

	//フォーム
	$contents .=  '<form method="post" action="'.$_SERVER['PHP_SELF'].'" name="setup">
	管理者パスワード: <input type="text" name="adminpass" value="'.$userini[admin].'"><br /><br />';
	$userno=1;//usernoを1に
	foreach($userini as $name=>$pass){//$useriniを$nameと$passに展開

		if($name !="admin"){//管理者IDを除外
			$contents .= 'ユーザ'.$userno.' :<input type="text" name="username[]" value="'.$name.'"> Pass:<input type="text" name="userpass[]" value="'.$pass.'"><br />';//IDとパスワードを$_POST[username]と$_POST[userpass]に配列として
			$userno++;//$usernoに1加える
		}
	}

	//最後に1つ空欄を作る
	$contents .= 'ユーザ'.$userno.' :<input type="text" name="username[]" value=""> Pass:<input type="text" name="userpass[]" value=""><br />';
	$contents .='<input type="submit" value="設定"></form>';//送信ボタン



	setcookie("PASS", md5( $userini['admin']),time() +30);//読み込み後にC00KIEを再設定


	//$footerを設定
	$footer='<hr /><div class="copy">Copyright(c)2010 <a href="http://photoartisan.jp">Studio PhotoArtisan</a></div>
	</body></html>';



	//html出力
	echo $html_headder;
	echo $contents;
	echo $footer;
	
}
else{//COOKIEで認証できなかった場合
	setcookie("msg", "一定時間操作が行われなかったため、ログアウトしました。<br />再度ログインしてください。", time() +5);//COOKIEにメッセージを格納
	header("Location:index.php");//indexへ移動
}
?>
user.ini.phpのパスワード情報を$useriniに読み込み、COOKIEにセットされたパスワードと照合します。
照合できた場合は、$useriniの中身をフォーム入力欄に展開します。
POSTされたときは$useriniをPOSTされた値に置き換え、user.ini.phpを書き換えます。

user.php

<?php
//
// +----------------------------------------------------------------------+
//pa_auth
// +----------------------------------------------------------------------+
//@package pa_auth 0.1(beta) 2010/8/9
//@author Studio PhotoArtisan
//@copyright 2010 Studio PhotoArtisan
//

$userini = parse_ini_file('user.ini.php');//iniファイル読み込み
$id = $_COOKIE[ID];//IDをCOOKIEから取得

if(isset($_COOKIE["PASS"]) && md5($userini[$id]) === $_COOKIE["PASS"]){//COOKIEの認証情報を確認


	//ログイン時実行プログラム
	$contents = $id.'でログイン中   <a href="index.php">ログアウト</a><br />';
	$contents .= '<a href ="'.$_SERVER["PHP_SELF"].'?action=demo">操作のデモ</a><br />';
	$contents .=  'ユーザ領域です。実行プログラムをここに記載して下さい。<br />';

	if($_GET[action] == "demo"){
		$contents .= "デモプログラムです";
	}

//ここまでログイン時実行プログラム



//html_headderを設定
	$html_headder='<?xml version="1.0" encoding="UTF-8"?>
	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
	<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<meta http-equiv="Content-Script-Type" content="text/javascript" />
	<link rel="stylesheet" href="style.css" type="text/css" />
	<title>ユーザ画面</title>
	</head>';

	setcookie("PASS", md5($userini[$id]) ,time() +30);//読み込み後にCOOKIEを再設定


	//$footerを設定
	$footer='<hr /><div class="copy">Copyright(c)2010 <a href="http://photoartisan.jp">Studio PhotoArtisan</a></div>
	</body></html>';



	//html出力
	echo $html_headder;
	echo $msg;
	echo $contents;
	echo $footer;
	
}
else{//COOKIEで認証できなかった場合
	setcookie("msg", "一定時間操作が行われなかったため、ログアウトしました。<br />再度ログインしてください。", time() +5);//COOKIEにメッセージを格納
	header("Location:index.php");//indexへ移動
}



?>
admin.phpと同様にログイン情報を照合しています。
$idにユーザIDを格納しているので、これを利用してユーザごとに違う処理を行うこともできます。

user.ini.php

<?php /*
admin=pass
user1=1111
user2=2222
user3=3333
*/ ?>
中身は通常のiniファイルですので、1行ごとに
ユーザ名=パスワード 改行
というように書き込みますが、ブラウザから読まれないために
<?php /*
*/ ?>
で囲んでいます。
これにより、通常のブラウザにはPHPのコメントとして扱われるため、表示できません。

ライセンス
フリーウェア
このままではログインするだけのプログラムですので、自由に改変してお使いください。
簡易的なユーザ認証ですので、セキュリティ面には責任を一切負いません。
ご自身の責任でお使いください。
このプラグラムに関しては著作権表示を外してもらって構いませんが、どこかに当サイトへのリンクを張っていただけるとありがたいです。

トラックバック(0)

トラックバックURL: http://photoartisan.jp/mt/mt-tb.cgi/44

コメントする