[PHP] #12 PHP 폼 데이터 입력 검증 및 보안, 안전한 웹 개발의 시작

2025. 7. 23. 16:00·Programming/PHP
반응형

 

안녕하세요, 토스트 데브입니다.

폼 데이터를 처리할 때 단순히 값을 출력하고 저장하는 것만큼이나 중요한 것이 바로 "입력값 검증"과 "보안"입니다.
이것이 제대로 되지 않으면 사이트는 해킹이나 데이터 유출에 쉽게 노출될 수 있어요.

이번 글에서는 PHP로 폼 데이터를 처리할 때 반드시 고려해야 할 입력 유효성 검사와 보안 요소들을 정리해드릴게요.

 

✅ 1. 입력값 존재 여부 확인 – isset()과 empty()

가장 기본적인 검증은 입력값이 있는지 확인하는 것입니다.

if (isset($_POST["name"]) && !empty($_POST["name"])) {
  $name = $_POST["name"];
} else {
  echo "이름을 입력해주세요.";
}
  • isset() : 값이 설정되었는지
  • empty() : 값이 비어 있는지

 

 

✅ 2. 공백 제거 – trim()

사용자가 입력한 값에 불필요한 앞뒤 공백이 포함될 수 있으므로 trim()으로 제거해주는 것이 좋습니다.

$name = trim($_POST["name"]);

 

 

✅ 3. HTML 특수문자 처리 – htmlspecialchars()

XSS(크로스 사이트 스크립팅) 공격을 막기 위해 HTML 특수문자를 무해한 문자로 변환합니다.

$name = htmlspecialchars(trim($_POST["name"]));

📌 사용 예시 결과

<script>alert(1)</script> → &lt;script&gt;alert(1)&lt;/script&gt;

 

 

✅ 4. 이메일, 숫자 등 형식 검증 – filter_var()

입력값이 이메일, URL, 숫자 등일 경우에는 PHP 내장 함수인 filter_var()를 사용하는 것이 좋습니다.

// 이메일 검증 예시
$email = $_POST["email"];

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

// 숫자 검증 예시
$age = $_POST["age"];

if (!filter_var($age, FILTER_VALIDATE_INT)) {
  echo "숫자만 입력 가능합니다.";
}

// URL 검사 예시
$url = $_POST["url"];

if (!filter_var($url, FILTER_VALIDATE_URL)) {
  echo "유효하지 않은 URL 입니다.";
}

 

 

⚠️ 5. SQL Injection 방지

SQL Injection은 해커가 악의적인 SQL 문장을 주입해 DB를 조작하거나 정보를 탈취하는 공격입니다.

❌ 이런 식은 매우 위험합니다!

// 사용자가 입력한 아이디를 그대로 SQL에 넣음
$id = $_POST["id"];
$sql = "SELECT * FROM users WHERE id = '$id'";

✅ PDO + Prepared Statement로 방어하세요!

$pdo = new PDO("mysql:host=localhost;dbname=test", "root", "");
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(":id", $_POST["id"]);
$stmt->execute();

📌 prepare() + bindParam() 조합은 SQL Injection을 원천 차단합니다.

 

 

⚠️ 6. CSRF (Cross-Site Request Forgery) 방지

CSRF는 로그인 상태의 사용자를 속여 원하지 않는 요청을 보내게 하는 공격입니다.

✅ 대응 방법:

  • CSRF 토큰을 폼에 숨겨서 서버에서 검증
// form 안에 hidden input 추가
<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
// 서버에서 비교
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
  exit('잘못된 요청입니다.');
}
🔐 세션 기반으로 CSRF 토큰을 발급하고 검증하는 로직을 반드시 구축하세요.

 

 

✅ 그 외 보안 체크리스트

항목 설명
파일 업로드 제한 확장자, 크기, MIME 타입 검증
세션 고정 공격 방지 로그인 시 session_regenerate_id() 사용
출력 시 escaping DB나 입력값을 직접 출력하지 않기
에러 메시지 노출 제한 사용자에게 시스템 정보가 노출되지 않도록 설정

 

 

✅ 마무리 요약

PHP에서 폼 데이터를 처리할 때, 다음의 보안 요소들을 반드시 적용하세요:

  • ✔ 입력값 유무 및 형식 확인
  • ✔ htmlspecialchars()로 XSS 방지
  • ✔ filter_var()로 이메일/숫자 검증
  • ✔ Prepared Statement로 SQL Injection 방어
  • ✔ CSRF 토큰으로 요청 위조 방지

 

보안은 옵션이 아닌 필수입니다.
특히 사용자 정보를 다루는 기능을 개발할 때는 기능보다 보안이 먼저 고려되어야 한다는 점을 꼭 기억하세요.

 

 

#PHP보안 #입력검증 #폼처리 #XSS방지 #SQLInjection #CSRF #filter_var #htmlspecialchars #웹개발보안 #PHP기초 #코딩보안 #웹보안기초 #toastdev #trim 

 

반응형
저작자표시 비영리 (새창열림)

'Programming > PHP' 카테고리의 다른 글

[PHP] #14 PHP로 XML 응답 처리 하는 방법, 외부 데이터 읽기 및 파싱 가이드!  (0) 2025.07.25
[PHP] #13 PHP 세션(Session)과 쿠키(Cookie) 완벽 이해하기  (2) 2025.07.24
[PHP] #11 PHP 폼 데이터 처리, GET과 POST 처리 방식까지 완벽정리!  (2) 2025.07.22
[PHP] #10 PHP 함수(Function), 정의, 호출, 매개변수, 변환값, 배열 변환까지 완벽 정리!  (0) 2025.07.21
[PHP] #09 PHP의 Switch문, 여러 조건을 깔끔하게 처리하는 방법!  (0) 2025.07.20
'Programming/PHP' 카테고리의 다른 글
  • [PHP] #14 PHP로 XML 응답 처리 하는 방법, 외부 데이터 읽기 및 파싱 가이드!
  • [PHP] #13 PHP 세션(Session)과 쿠키(Cookie) 완벽 이해하기
  • [PHP] #11 PHP 폼 데이터 처리, GET과 POST 처리 방식까지 완벽정리!
  • [PHP] #10 PHP 함수(Function), 정의, 호출, 매개변수, 변환값, 배열 변환까지 완벽 정리!
TOASTDEV
TOASTDEV
인스턴트 코딩 #토스트데브 #토스트뎁 #코딩공부 #개발입문
  • TOASTDEV
    토스트뎁
    TOASTDEV
    • 분류 전체보기 (59) N
      • 알쓸신잡 (20)
        • 코딩에 대하여 (13)
        • 컴퓨터에 대하여 (5)
        • IT 국내외 소식 (2)
      • Web Front (6)
        • HTML (6)
        • CSS (0)
        • JavaScript (0)
      • Programming (15)
        • PHP (15)
      • Database (7) N
        • SQL (7) N
        • MySQL (0)
      • Server (11) N
        • Linux (11) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Youtube Toastdev
    • Naver Blog
  • 공지사항

    • [유튜브] 유튜브 영상 업로드 안내
  • 인기 글

  • 태그

    코딩공부
    SQL문법
    서버입문
    HTML
    웹개발입문
    php코딩
    리눅스서버
    dbms
    프론트엔드
    SQL강의
    php기초
    서버관리
    php입문
    웹개발기초
    html기초
    ubuntuserver
    코딩입문
    우분투서버
    코딩기초
    웹프로그래밍
    ubuntu서버
    php문법
    데이터베이스
    SQL기초
    ict
    데이터분석
    리눅스기초
    sql
    php
    웹개발
  • 최근 댓글

  • 최근 글

  • 전체
    오늘
    어제
  • 반응형
  • hELLO· Designed By정상우.v4.10.3
TOASTDEV
[PHP] #12 PHP 폼 데이터 입력 검증 및 보안, 안전한 웹 개발의 시작
상단으로

티스토리툴바