PHP/포스팅

[PHP] POST 방식 폼 양식의 데이터 처리

짜집퍼박사(짜박) 2024. 12. 25. 23:29

PHP에서 POST 방식을 사용한 데이터 처리는 입력 폼 생성, 서버에서 데이터 수신, 데이터 검증 및 처리로 이루어집니다.

 

1. POST 방식이란?

POST 방식은 클라이언트에서 서버로 데이터를 전송하는 HTTP 요청 방식 중 하나입니다.

 

특징

- 데이터를 HTTP 본문에 포함하여 전송.

- 데이터 크기의 제한이 크며 보안성이 더 높음(GET과 비교 시).

- URL에 데이터가 노출되지 않음.

 

2. 흐름 설명

A.  입력 폼 생성 (HTML)

사용자로부터 데이터를 입력받는 HTML 페이지.

B. 서버 데이터 수신 (PHP)

PHP는 $_POST 배열을 통해 POST 데이터를 처리.

C. 데이터 검증 및 처리

데이터 유효성을 검사하고, 필요하면 데이터베이스에 저장하거나, 결과를 사용자에게 보여줌.

 

3. 예제 소스 코드

(1) index.php - 입력 폼

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>POST 방식 데이터 입력</title>
</head>
<body>
    <h1>POST 방식 데이터 입력</h1>
    <form action="process.php" method="POST">
        <label for="username">사용자 이름:</label>
        <input type="text" id="username" name="username" required>
        <br><br>
        <label for="email">이메일:</label>
        <input type="email" id="email" name="email" required>
        <br><br>
        <label for="message">메시지:</label>
        <textarea id="message" name="message" rows="5" required></textarea>
        <br><br>
        <button type="submit">전송</button>
    </form>
</body>
</html>

 

(2) process.php - 데이터 처리

<?php
// 데이터 수신
$username = $_POST['username'] ?? ''; // 사용자 이름
$email = $_POST['email'] ?? '';       // 이메일
$message = $_POST['message'] ?? '';   // 메시지

// 입력값 검증
if (empty($username) || empty($email) || empty($message)) {
    die('모든 필드를 입력해야 합니다.');
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    die('유효한 이메일 주소를 입력하세요.');
}

// HTML 엔티티 처리 (XSS 방지)
$username = htmlspecialchars($username, ENT_QUOTES, 'UTF-8');
$email = htmlspecialchars($email, ENT_QUOTES, 'UTF-8');
$message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8');

// 데이터 저장 (예: 파일에 저장)
$file = 'data.txt';
$entry = "이름: $username, 이메일: $email, 메시지: $message\n";
file_put_contents($file, $entry, FILE_APPEND);

// 결과 출력
?>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>처리 결과</title>
</head>
<body>
    <h1>처리 결과</h1>
    <p>사용자 이름: <?= $username ?></p>
    <p>이메일: <?= $email ?></p>
    <p>메시지:</p>
    <pre><?= $message ?></pre>
    <br>
    <a href="index.php">돌아가기</a>
</body>
</html>

 

4. 코드 설명

(1) $_POST 배열

- $_POST는 POST 방식으로 전송된 데이터를 배열 형태로 저장.

- 데이터가 존재하지 않을 경우 기본값을 지정

$username = $_POST['username'] ?? '';

 

(2) 입력 검증

- 빈 값 검사: empty()로 필드가 비어 있는지 확인.

- 이메일 형식 검증: filter_var로 유효한 이메일인지 확인.

 

(3) HTML 엔티티 처리

- 사용자 입력 데이터를 그대로 출력하면 XSS 공격에 취약.

- htmlspecialchars()로 HTML 태그를 엔티티로 변환

$username = htmlspecialchars($username, ENT_QUOTES, 'UTF-8');

 

(4) 데이터 저장

- 예제에서는 데이터를 텍스트 파일(data.txt)에 저장.

- 파일에 추가하기 위해 FILE_APPEND 플래그 사용

file_put_contents($file, $entry, FILE_APPEND);

 

5. 실행 결과

(1) 입력 예시 (index.php):

사용자 이름: 홍길동
이메일: hong@example.com
메시지: 안녕하세요!

 

(2) 출력 결과 (process.php)

<h1>처리 결과</h1>
<p>사용자 이름: 홍길동</p>
<p>이메일: hong@example.com</p>
<p>메시지:</p>
<pre>안녕하세요!</pre>

 

(3) 저장된 데이터 (data.txt)

이름: 홍길동, 이메일: hong@example.com, 메시지: 안녕하세요!

 

6. 보안 고려사항

(1) XSS 방지

htmlspecialchars()로 출력 데이터를 필터링.

(2) SQL Injection 방지

데이터베이스 사용 시 반드시 Prepared Statements 사용.

(3) CSRF 방지

CSRF 토큰을 생성하고 서버에서 검증.

(4) 파일 권한

데이터 저장 파일의 권한을 안전하게 설정(chmod 600 등).

 

7. 실무 확장

- 데이터 저장을 데이터베이스(MySQL, PostgreSQL)로 확장.

- Ajax를 활용하여 비동기 데이터 처리 구현.

- 템플릿 엔진(예: Blade, Twig)으로 HTML 분리 및 관리.

 

With ChatGPT

'PHP > 포스팅' 카테고리의 다른 글

[PHP] XSS 방지  (0) 2024.12.26
[PHP] GET 방식 폼 양식의 데이터 처리  (0) 2024.12.26
[PHP] 함수의 매개변수  (0) 2024.12.01
[PHP] 재귀 함수  (0) 2024.12.01
[PHP] [함수] 클로저(Closure)  (0) 2024.12.01