안녕하세요, 토스트 데브입니다.
폼 데이터를 처리할 때 단순히 값을 출력하고 저장하는 것만큼이나 중요한 것이 바로 "입력값 검증"과 "보안"입니다.
이것이 제대로 되지 않으면 사이트는 해킹이나 데이터 유출에 쉽게 노출될 수 있어요.
이번 글에서는 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> → <script>alert(1)</script>
✅ 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 |