PHP-로그인 폼작성
PHP-로그인 폼작성
<?PHP
// h() 함수 레시피 218를 불러옵니다 레시피 041.
require_once '../../../../lib/h.php';
// password_verify() 함수 레시피 217를 불러옵니다.
require_once '../../../../lib/password_compat/password.php';
// 클릭 재킹(Clickjacking)을 방지 레시피 287합니다.
header('X-FRAME-OPTIONS: SAMEORIGIN');
// 세션을 시작합니다.
session_start();
// 사용자명과 암호를 설정합니다. 복수 사용자 계정을 설정할 수 있습니다.
$userid[] = 'admin'; // 사용자 ID
$username[] = '관리자'; // 이름
// 패스워드 'pass1'를 password_hash() 함수로 해시화한 문자열
$hash[] = '$2y$10$7llM8TDTW3cxrMPzwd1ydOky3FP7yYOzn/d4bEWWbeFDiQ.tTbM3O';
$userid[] = 'test';
$username[] = '테스트';
// 패스워드 'pass2'를 password_hash() 함수로 해시화한 문자열
$hash[] = '$2y$10$qNxqM4UP79klxfqV9cIwcO6LBJI44Z34k76m9w9teN.PLpfTe8lxG';
// 오류 메세지의 변수를 초기화합니다.
$error = '';
// 인증 여부의 세션 변수를 초기화합니다.
if (! isset($_SESSION['auth'])) {
$_SESSION['auth'] = false;
}
if (isset($_POST['userid']) && isset($_POST['password'])) {
foreach ($userid as $key => $value) {
if ($_POST['userid'] === $userid[$key] &&
// 입력된 패스워드 문자열과 해시화된 패스워드를 조합합니다.
password_verify($_POST['password'], $hash[$key])) {
// 세션 고정화 공격 레시피 298을 막기 위해 세션 ID를 변경합니다.
session_regenerate_id(true);
$_SESSION['auth'] = true;
$_SESSION['username'] = $username[$key];
break;
}
}
if ($_SESSION['auth'] === false) {
$error = '사용자 ID나 패스워드가 잘못되었습니다.';
}
}
if ($_SESSION['auth'] !== true) {
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>간단한 로그인 폼을 작성하고 싶을 때</title>
</head>
<body>
<div id="login">
<h1>인증 폼</h1>
<?php
if ($error) { // 오류 메세지가 세팅되어 있으면 빨간색으로 표시
echo '<p style="color:red;">' . h ($error) . '</p>';
}
?>
<form action="<?php echo h($_SERVER['SCRIPT_NAME']); ?>" method="post">
<dl>
<dt><label for="userid">사용자 ID:</label></dt>
<dd><input type="text" name="userid" id="userid" value=""></dd>
</dl>
<dl>
<dt><label for="password">패스워드:</label></dt>
<dd><input type="password" name="password" id="password" value=""></dd>
</dl>
<input type="submit" name="submit" value="로그인">
</form>
</div>
</body>
</html>
<?php
// 스크립트를 종료하고 인증이 필요한 페이지가 표시되지 않도록 합니다.
exit ();
}