일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 페그오
- 영어단어
- 타라옷
- 일본패치
- 어린궁기
- 페이트그랜드오더
- 매드클라운
- 미국주식
- 북천황의감옥
- 체마1등
- 2차신수
- 막피범
- 2차승급
- 나스닥
- 보물수호
- 주작의용천제일검
- 바람의나라연
- 피렌체
- 매일영어단어
- 걸스데이
- 레어닉
- 모바일바람의나라
- 매일영어단어외우기
- 돌림판이벤트
- Eminem
- 아이유
- 수지
- 에미넴
- 폭선우의무덤
- 바람의나라
- Today
- Total
티스의 이야기
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
}
?>
'프로그래밍' 카테고리의 다른 글
PHP-magic_quotes_gpc (0) | 2016.06.23 |
---|---|
PHP-메일전송폼3 (3) | 2016.06.17 |
PHP-메일 전송 코드 (0) | 2016.06.16 |
PHP-메일전송 폼을 작성하고 싶을때 (0) | 2016.06.15 |
PHP-인증을 요구하고 싶은 페이지 (0) | 2016.06.14 |