PHP htmlspecialchars() — HTML 특수문자 이스케이프와 XSS 방어
htmlspecialchars()는 HTML 특수문자(< > & " ')를 HTML 엔티티로 변환하는 함수입니다. 사용자 입력을 화면에 그대로 출력할 때 반드시 거쳐야 하는 XSS(크로스 사이트 스크립팅) 방어의 첫 번째 관문입니다.
→ 태그가 텍스트로 그대로 표시됨
게시판이나 댓글 폼에 사용자가 악의적인 스크립트를 입력하면, 서버가 그것을 그대로 HTML로 출력했을 때 다른 사용자의 브라우저에서 실행됩니다. 이것이 XSS 공격입니다. htmlspecialchars()는 이를 텍스트로 만들어 실행 자체를 막습니다.
echo $name;
입력: <script>alert('해킹!')</script>
→ 실제 alert가 실행됨!
echo htmlspecialchars($name, ENT_QUOTES);
→ <script>alert(...)</script>
텍스트로만 표시, 실행 안 됨
htmlspecialchars()는 HTML에서 특별한 의미를 가진 5가지 문자를 엔티티로 변환합니다. 각각이 왜 위험한지, 어떤 엔티티로 바뀌는지 확인해두면 이스케이프 로직을 이해하기 쉽습니다.
| 원래 문자 | HTML 엔티티 | 변환 이유 |
|---|---|---|
& (앰퍼샌드) |
& |
엔티티 시작 문자 — 다른 엔티티와 충돌 방지 |
< (꺾쇠 열기) |
< |
태그 시작 — <script> 등의 실행 방지 |
> (꺾쇠 닫기) |
> |
태그 종료 — 태그 구조 탈출 방지 |
" (큰따옴표) |
" |
속성값 탈출 방지. ENT_QUOTES나 기본값에서 변환 |
' (작은따옴표) |
' |
속성값 탈출 방지. ENT_QUOTES 지정 시에만 변환 |
&는 반드시 가장 먼저 변환되어야 합니다. <를 먼저 변환하면 <의 &가 다시 변환되어 이중 인코딩이 됩니다.HTML 속성값을 작은따옴표로 감싸는 경우가 있습니다(<div class='값'>). 이때 이스케이프 없이 작은따옴표가 들어오면 속성을 조기 종료하고 이벤트 핸들러를 삽입할 수 있습니다. ENT_QUOTES는 큰따옴표와 작은따옴표 모두를 안전하게 처리합니다.
ENT_QUOTES를 지정하는 습관을 들이는 것이 안전합니다. 어떤 맥락에서 출력될지 미리 알기 어렵기 때문입니다.
두 함수 모두 XSS 방어에 쓰이지만 접근 방식이 다릅니다. htmlspecialchars()는 태그를 텍스트로 변환해 보존하고, strip_tags()는 태그를 완전히 제거합니다.
PHP 5.4 이전에는 기본 인코딩이 ISO-8859-1이었습니다. 한글이 포함된 경우 인코딩 불일치로 변환이 깨질 수 있습니다. 세 번째 인수로 'UTF-8'을 명시하면 안전합니다.
| 실수 | 증상 | 해결 |
|---|---|---|
| htmlspecialchars 없이 사용자 입력 출력 | XSS 공격 성공 — 악성 스크립트 실행 | 출력 전 반드시 htmlspecialchars($v, ENT_QUOTES) 적용 |
| ENT_QUOTES 생략 | 작은따옴표로 속성값 탈출 가능 — HTML 속성에 출력 시 위험 | 항상 ENT_QUOTES 명시 |
| 이중 인코딩 | 이미 이스케이프된 문자열에 다시 적용해 &lt; 등이 됨 | 입력 시 1회만 적용, DB 저장 후 출력 시 다시 적용하지 않도록 관리 |
| strip_tags와 혼용 | strip_tags로 제거 후 htmlspecialchars 적용 — 중복 처리, 의도 불명확 | 목적에 맞게 하나만 선택: 원문 표시=htmlspecialchars, 태그제거=strip_tags |
| DB 저장 전에만 처리 | DB에 엔티티로 저장 → 검색 어려워짐 | DB는 원문 저장, 출력 시에만 htmlspecialchars 적용 |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| PHP mb_strlen() — 한글 글자 수 정확히 세기 · strlen과 차이 완전 정리 (0) | 2026.07.10 |
|---|---|
| PHP list() — 배열 분해 할당 · 구조 분해 단축 문법 완전 정리 (1) | 2026.07.10 |
| PHP array_unshift() — 배열 맨 앞에 요소 추가 · 재인덱싱 · push/shift 비교 완전 정리 (0) | 2026.07.10 |
| PHP array_reverse() — 배열 순서 뒤집기 · preserve_keys 옵션 완전 정리 (0) | 2026.07.10 |
| PHP array_merge() — 두 배열 합치기 · 키 충돌 규칙 · + 연산자와 차이 완전 정리 (0) | 2026.07.09 |
왕진 블로그

댓글