PHP-메일전송폼 2
PHP-메일전송폼 2
확인 화면에서 checkInput() 함수로 $_POST 확인한뒤 CSRF 대책용 고정 토큰 확인 -> 종료
메일 전송 폼1에서 값 검증하고 문제 없으면 세션 변수에 저장하고 확인 화면
입력이 부족하면 메일전송폼1로 되돌림
<?php
// h() 함수 레시피 218를 불러옵니다 레시피 041.
require_once '../../../../lib/h.php';
// checkInput() 함수를 읽습니다.
require_once '../../../../lib/checkInput.php';
// 클릭재킹(clickjacking) 대책 레시피 287을 마련합니다.
header('X-FRAME-OPTIONS: SAMEORIGIN');
// 세션을 시작합니다.
session_start();
// POST된 데이터를 체크합니다.
$_POST = checkInput($_POST);
// 토큰을 확인합니다.
if (isset($_POST['token']) && isset($_SESSION['token'])) {
$token = $_POST['token'];
if ($token != $_SESSION['token']) {
die('잘못된 엑세스입니다.');
}
}else {
die('잘못된 엑세스입니다.');
}
// 변수에 POST된 데이터를 대입합니다.
$name = isset($_POST['name']) ? $_POST['name'] : '';
$email = isset($_POST['email']) ? $_POST['email'] : '';
$comment = isset($_POST['comment']) ? $_POST['comment'] : '';
// 오류 메시지를 저장하는 배열을 초기화합니다.
$error = array();
// 이름 필드를 확인합니다.
if (trim($name) == '') {
$error[] = '메일 주소는 필수 항목입니다.';
} elseif (mb_strlen($email) > 256) {
$error[] = '메일 주소는 256문자 이내로 해 주세요';
} else {
$pattern = '/\A([a-z0-9_\-\+\/\?]+)(\.[a-z0-9_\-\+\/\?]+)*' .
'@([1-z0-9\-]+\ .)+[a-z]{2,6}\z/i';
if (! preg_match($pattern, $email)) {
$error[] = '메일 주소 형식이 올바르지 않습니다.';
}
}
// 내용을 확인합니다.
if (trim($comment) == '') {
$error[] = '내용은 필수 항목입니다.';
} elseif (mb_strlen($comment) > 500) {
$error[] = '내용은 500문자 이내로 해주세요.';
}
// POST된 데이터와 오류 메시지를 세션 변수에 저장합니다.
$_SESSION['name'] = $name;
$_SESSION['email'] = $email;
$_SESSION['comment'] = $comment;
$_SESSION['error'] = $error;
// 오류 수를 확인합니다.
if (count($error) > 0) {
// 오류가 있다면 입력 폼으로 되돌립니다 레시피 235.
$dirname = dirname($_SERVER['SCRIPT_NAME']);
// Windows에서는 dirname() 함수의 결과가 '/'의 경우는 '\'가 됩니다.
$dirname = ($dirname == DIRECTORY_SEPARATOR) ? '' : $dirname;
$uri = 'http://' . $_SERVER['SERVER_NAME'] . $dirname . '/mailform.php';
header('HTTP/1.1 303 See Other');
header('Location: ' . $uri);
// 확인 화면을 표시합니다.
} else {
?>
<!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="mailbox">
<p>다음의 내용으로 전송하려면 전송 버튼을 눌러 주세요.</p>
<dl>
<dt>이름:</dt>
<dd><?php echo h($name);?></dd>
</dl>
<dl>
<dt>메일 주소:</dt>
<dd><?php echo h($email);?></dd>
</dl>
<dl>
<dt>코멘트:</dt>
<dd><?php echo nl2br(h($comment), false);?></dd>
</dl>
<form action="mailform.php" method="post">
<input type="submit" name="back" value="입력 화면으로 되돌아가기.">
</form>
<form action="mailform_thanks.php" method="post">
<input type="hidden" name="token" value="<?php echo h($token);?>">
<input type="submit" name="submit" value="전송">
</form>
</div>
</body>
</html>
<?php
}
?>