webdata
DX推進をサポートする技術者向け情報提供サイト

技術者向け技術情報

TOP >技術者向け技術情報 > 認証と滞在時間制限

【PHP】認証と滞在時間制限

 2022-07-24 (更新日:2022-07-24)
 パスワードによる認証とクッキーによる認証をご紹介します。

■一般的なパスワード認証プログラム例

<?php

	$conn = mysqli_connect();       //DB接続 パラメータを記載のこと

	$fnc = $_POST["fnc"];
	$input_id = $_POST["input_id"];
	$input_pass = $_POST["input_pass"];

	if($fnc == 1){
		if(empty($input_id){
			$mess1 = 'IDが未入力です。';
		}
		if(empty($input_id){
			$mess2 = 'パスワードが未入力です。';
		}
		$mess = $mess1.$mess2;
		if(empty()){
			$input_id = mysqli_real_escape_string($conn,$input_id);		//不正文字にエスケープ
			$input_pass = mysqli_real_escape_string($conn,$input_pass);	//不正文字にエスケープ

			$sql = "select 担当者ID from 担当者マスター
					where 担当者ID = '$input_id'
					and パスワード = '$input_pass';";
			$res = mysqli_query($conn,$sql);
			$row = mysqli_fetch_array($res);
				$tanto_chk = $row["担当者ID"];
				if(empty($tanto_chk)){
					$mess = 'IDもしくがパスワードが違います。';
				}else{
					$url = 'https://****.****:.jp/******.php';		//認証後転送させるURL
					header("Location: {$url}");	
				}
		}
	}
echo <<<EOF
	<table>
		<form method="POST" action="{$_SERVER["PHP_SELF"]}">
				<input type="hidden" name="fnc" value="1">
		<tr>
			<td width=200">ID
			<td width=300">
				<input type="text" name="input_id">
			</td>
			<td width=200">Password
			<td>
				<input type="text" name="input_pass">
			</td>
		</tr>
		</form>
	</table>
	
EOF;
?>	
							

■クッキ認証設定例

	<?php
	
		##session
		session_start();		//セッション、クッキーを使うときは必ず最初にこの関数を記載のこと

		$accessID = $_cookie['accessID'];		//クッキーaccessIDの読み込み
		$conn = mysqli_connect();       		//DB接続 パラメータを記載のこと

		$fnc = $_POST["fnc"];
		$input_id = $_POST["input_id"];
		$input_pass = $_POST["input_pass"];

		if(empty($accessID)){					//アクセス初回
			
			//データチェック、エスケープ処理は省略

			$sql = "select 担当者ID from 担当者マスター
						where 担当者ID = '$input_id'
						and パスワード = '$input_pass';";
			$res = mysqli_query($conn,$sql);
			$row = mysqli_fetch_array($res);
				$id = $row["担当者ID"];
				if(empty($id)){
					echo '権限がありません';
				}else{
					$url = 'サイトのドメイン名';			//例)www.sample.jp
					setcookie("accessID","$id",time() + 86400,"/","$url");		//クッキーの登録
				}
		}

	以下省略
	
	?>	
								
<解説>
 まず、アクセス時にaccessIDとして登録されているクッキーを呼び出します。
クッキーが登録されていれば、認証を通します。この登録されたaccessIDが本当に認証対象かの確認のため データベースでチェックするのが望ましいです。サンプルはこれを省略してます。
 次に、$_cookie['accessID']がない場合、新規登録として判定し、ID、パスワードにチェックでOKなら setcookie()にてaccessIDとしてクッキーに登録します。クッキーの登録時間は設定できサンプルのケースはでは86400秒つまり1日です。要件に合わせ時間を設定下さい。

■滞在時間設定

抜粋
	
	//$_SESSION['time']の読み込み
	$lasttime = $_SESSION['time'];		//前回のアクセス時間

	//有効期限
	$expire = 1200;			//1200秒

	//期限切れ判定
	$timestamp = time();					//現在の時間
	$chktime = $timestamp - $lasttime;
	if(!empty($lasttime) and $chktime > $expire){			//20分以上経過時は期限切れのページへ遷移
		$re_url = 'https://ドメイン名/ディレクトリー/******.php';		//期限切れ表示ページ
		header("Location: $re_url");
		exit;
	}

	//$_SESSION['time']へのアクセス時間の書き込み
	$_SESSION['time'] = time();		//今回アクセスした時間を登録

								
<解説>
 まず、アクセス時にtimeとして登録されているセッションを呼び出します。
$_SESSION['time']が登録されていれば、判定を通します。この登録された時間と今読み込んだ現在の時間との差が 1200秒以上であれば期限切れのページに転送されます。$_SESSION['time']が登録されていなければこの判定処理はされません。
 尚、SESSIONの有効時間は24分です。よって次回アクセス時に判定されることはほぼありません。この設定はphp.iniで設定できます。 有効時間を20分に設定しておけば間違いなくきっちりと判定されます。