티스의 이야기

PHP-로그인 폼작성 본문

프로그래밍

PHP-로그인 폼작성

밍딩이 2016. 6. 13. 10:19

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 ();

}


Comments