반응형
Web Development · PHP 문자열 함수 · 보안
PHP strip_tags() — HTML 태그를 완전히 제거하는 함수
허용 태그 지정 · htmlspecialchars와 차이 · XSS 방어 한계 완전 정리
시작 오늘 분석할 코드
strip_tags()는 문자열에서 HTML 및 PHP 태그를 모두 제거하고 순수 텍스트만 남기는 함수입니다. 두 번째 인수로 허용할 태그를 지정할 수 있어, 일부 서식 태그는 유지하면서 위험한 태그만 제거하는 용도로도 사용됩니다.
<?php $string = '<A href="http://www.namgarambooks.co.kr/">남가람북스</A><hr><br>'; $result = strip_tags($string); // <A>, <hr>, <br> 태그가 모두 제거됨 // 링크 텍스트인 "남가람북스"만 남음 print $result; // 남가람북스 ?>
실제 출력 미리보기
입력 $string
<A href="...">남가람북스</A><hr><br>
↓ strip_tags()
출력 결과
남가람북스
태그가 모두 제거되고 텍스트 내용만 남음
용어 용어 정리
strip_tags()HTML/PHP 태그를 모두 제거하고 텍스트 내용만 반환하는 함수
허용 태그두 번째 인수로 제거하지 않을 태그를 지정 — <b><i> 등
태그 내용태그는 제거되지만 태그 사이의 텍스트는 보존됨 — <a>텍스트</a>에서 "텍스트" 유지
htmlspecialchars태그를 엔티티로 이스케이프 (보존+무력화). strip_tags는 완전 제거
XSSCross-Site Scripting. strip_tags 단독으로는 완전한 XSS 방어 불가
텍스트 추출HTML에서 순수 텍스트만 뽑을 때 strip_tags가 가장 간단한 방법
PHP 태그 제거<?php ?> 도 제거. PHP 코드가 삽입된 경우도 처리됨
배열 허용 (PHP 7.4+)두 번째 인수로 문자열 대신 배열로 허용 태그 지정 가능
1 기본 동작 — 태그는 사라지고 텍스트는 남는다
태그(<>)는 제거, 태그 안의 텍스트 내용은 보존
strip_tags()는 꺾쇠 괄호(< >)로 감싸진 모든 HTML 태그를 제거합니다. 단, 태그 사이의 텍스트 내용은 그대로 남습니다. <a href="...">링크텍스트</a>에서 <a>와 </a>는 없어지고 "링크텍스트"만 남는 방식입니다.
$html = '<h1>제목</h1><p>본문 내용</p><script>alert(1)</script>'; echo strip_tags($html); // 출력: 제목본문 내용alert(1) // 태그는 모두 제거됨 // 단, script 태그 안의 텍스트(alert(1))는 남음 ← 주의!
⚠️ strip_tags()는 태그를 제거하지만 태그 안의 텍스트는 남깁니다.
<script>alert(1)</script>에서 alert(1) 텍스트가 남을 수 있어 완전한 XSS 방어가 아닙니다.2 허용 태그 지정 — 일부 태그만 살리기
두 번째 인수로 제거하지 않을 태그를 명시
두 번째 인수로 허용할 태그를 문자열로 나열하면, 그 태그만 남기고 나머지는 제거합니다. 간단한 서식(굵게, 기울임)은 허용하면서 위험한 태그(script, iframe)는 제거할 때 사용합니다.
$html = '<b>굵게</b> <i>기울임</i> <script>악성코드</script> <p>단락</p>'; // <b>와 <i>만 허용, 나머지 태그 제거 echo strip_tags($html, '<b><i>'); // 출력: <b>굵게</b> <i>기울임</i> 악성코드 단락 // <b>, <i>는 그대로 / <script>, <p>는 제거 (내용은 남음) // PHP 7.4+ — 배열로 허용 태그 지정 echo strip_tags($html, ['b', 'i']); // 동일한 결과
※ 허용 태그를 지정해도 태그 속성은 그대로 남습니다.
<a href="javascript:...">를 허용하면 onclick 등의 이벤트 속성도 살아남아 XSS 위험이 있습니다.3 strip_tags vs htmlspecialchars — 목적이 다르다
제거 vs 무력화 — 어떤 상황에 어느 것을?
두 함수 모두 XSS 방어에 쓰이지만 접근이 다릅니다. strip_tags는 태그를 완전히 없애고, htmlspecialchars는 태그를 텍스트로 이스케이프해 화면에 그대로 보여줍니다.
strip_tags() — 태그 완전 제거
입력: <b>안녕</b>
출력: 안녕
태그가 사라짐
→ 원문을 그대로 보여줄 수 없음
출력: 안녕
태그가 사라짐
→ 원문을 그대로 보여줄 수 없음
htmlspecialchars() — 태그 이스케이프
입력: <b>안녕</b>
출력: <b>안녕</b>
태그가 텍스트로 표시됨
→ 원문이 그대로 보임
출력: <b>안녕</b>
태그가 텍스트로 표시됨
→ 원문이 그대로 보임
언제 무엇을?
- strip_tags: 순수 텍스트만 필요할 때 (요약문, 검색 인덱스, 미리보기 텍스트)
- htmlspecialchars: 사용자가 입력한 원문을 그대로 화면에 보여줄 때 (댓글, 게시글 원문 표시)
반응형
4 실전 활용 — HTML 요약문 만들기
게시글 목록의 미리보기 텍스트 생성에 자주 사용
게시글 목록에 본문 미리보기(발췌)를 보여줄 때, HTML 태그를 제거하고 순수 텍스트를 일정 길이로 자르는 패턴이 자주 쓰입니다. strip_tags + mb_substr 조합이 대표적입니다.
$content = '<p>안녕하세요! <b>오늘의 주제</b>는 PHP 함수입니다.</p>'; // 태그 제거 + 100글자 미리보기 $preview = mb_substr(strip_tags($content), 0, 100, 'UTF-8'); echo $preview; // 안녕하세요! 오늘의 주제는 PHP 함수입니다.
5 XSS 방어의 한계 — strip_tags만으로는 부족하다
허용 태그의 속성을 통한 공격 벡터
strip_tags()로 허용한 태그의 속성은 그대로 남습니다. 예를 들어 <a>를 허용하면 href="javascript:..."나 onclick="..." 같은 이벤트 핸들러도 살아남아 XSS 공격이 가능합니다.
$html = '<a href="javascript:alert(1)">클릭</a>'; // <a>를 허용했더니 javascript: 프로토콜도 살아남음 echo strip_tags($html, '<a>'); // 출력: <a href="javascript:alert(1)">클릭</a> // → 클릭 시 alert 실행됨! XSS 성공
⚠️ 사용자 입력의 완전한 XSS 방어에는 strip_tags보다 전문 HTML 정제 라이브러리(HTMLPurifier 등) 사용을 권장합니다. strip_tags()는 순수 텍스트 추출에 적합하지, 안전한 HTML 허용 목적으로는 부족합니다.
6 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| script 태그 내용이 남는 줄 모름 | <script>악성코드</script>에서 텍스트 남음 | 스크립트 내용도 제거 필요 시 정규식으로 script 블록 먼저 제거 |
| 허용 태그의 속성 공격 간과 | 허용한 <a>에 onclick, javascript: 살아남아 XSS | HTMLPurifier 등 전문 정제 라이브러리 사용 |
| strip_tags + strlen으로 한글 자르기 | 한글이 바이트 기준으로 잘려 깨짐 | strip_tags 후 mb_substr, mb_strlen 사용 |
| 빈 허용 태그 문자열 전달 | '' 전달 시 허용 태그가 없어 모두 제거됨 (의도와 다를 수 있음) | 허용 태그 없을 땐 인수 생략 |
| PHP 코드도 제거되는 걸 모름 | <?php ... ?> 도 strip_tags에 의해 제거됨 | 의도한 동작인지 확인, PHP 코드는 eval 금지 |
핵심 한 줄 요약
목적HTML에서 태그를 완전히 제거하고 텍스트 내용만 추출
허용 태그두 번째 인수로 살릴 태그 지정: strip_tags($html, '<b><i>')
vs htmlspecialcharsstrip=제거 / htmlspecialchars=이스케이프(텍스트화). 목적 다름
XSS 한계허용 태그의 속성(onclick, href=javascript:)은 제거 안 됨
주 활용게시글 미리보기 텍스트, 검색 인덱스, 순수 텍스트 추출
Tags
#PHP #strip_tags #HTML태그제거 #허용태그 #htmlspecialchars #XSS방어 #텍스트추출 #PHP문자열함수 #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, strip_tags, HTML태그제거, 허용태그, htmlspecialchars, XSS방어, 텍스트추출, PHP문자열함수, PHP함수, PHP학습, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| PHP substr() — 문자열 일부 추출 · 음수 인덱스 · mb_substr 차이 완전 정리 (0) | 2026.07.10 |
|---|---|
| PHP str_replace() — 문자열 찾아 바꾸기 · 배열 치환 · 대소문자 완전 정리 (0) | 2026.07.10 |
| PHP mb_strlen() — 한글 글자 수 정확히 세기 · strlen과 차이 완전 정리 (0) | 2026.07.10 |
| PHP list() — 배열 분해 할당 · 구조 분해 단축 문법 완전 정리 (1) | 2026.07.10 |
| PHP htmlspecialchars() — XSS 방어 · HTML 특수문자 이스케이프 완전 정리 (0) | 2026.07.10 |
왕진 블로그

댓글