PHP의 htmlspecialchars() 함수는 특수 문자를 HTML 엔티티로 변환하는 데 사용됩니다. 사용자 입력값을 웹 페이지에 출력할 때 발생할 수 있는 XSS(크로스 사이트 스크립팅) 공격을 방지하고, HTML 태그가 의도치 않게 실행되는 것을 막아주기 때문에 웹 개발에서 반드시 알아야 할 필수 함수입니다.
이 함수가 변환하는 미리 정의된 문자는 다음과 같습니다.
- & (앰퍼샌드) → &
- " (큰따옴표) → "
- ' (작은따옴표) → '
- < (보다 작음) → <
- > (보다 큼) → >
문법(Syntax)
htmlspecialchars(str, flags, character-set, double_encode)
매개변수(Parameters)
str : 변환할 문자열입니다.
flags : 따옴표 처리 방식, 잘못된 인코딩 처리 방식, 사용할 문서 타입(doctype)을 지정합니다.
사용 가능한 따옴표 스타일은 다음과 같습니다.
ENT_COMPAT : 기본값. 큰따옴표만 인코딩합니다.
ENT_QUOTES : 큰따옴표와 작은따옴표를 모두 인코딩합니다.
ENT_NOQUOTES : 어떤 따옴표도 인코딩하지 않습니다.
잘못된 인코딩 관련 플래그는 다음과 같습니다.
ENT_IGNORE : 함수가 빈 문자열을 반환하는 대신 잘못된 인코딩을 무시합니다. 보안상 문제가 발생할 수 있으므로 사용을 피하는 것이 좋습니다.
ENT_SUBSTITUTE : 빈 문자열을 반환하는 대신, 지정된 문자셋에서 잘못된 인코딩 부분을 유니코드 대체 문자 U+FFFD(UTF-8) 또는 &#FFFD;로 대체합니다.
ENT_DISALLOWED : 지정된 doctype에서 유효하지 않은 코드 포인트를 유니코드 대체 문자 U+FFFD(UTF-8) 또는 &#FFFD;로 대체합니다.
사용할 doctype을 지정하는 추가 플래그는 다음과 같습니다.
ENT_HTML401 : 기본값. 코드를 HTML 4.01로 처리합니다.
ENT_HTML5 : 코드를 HTML 5로 처리합니다.
ENT_XML1 : 코드를 XML 1로 처리합니다.
ENT_XHTML : 코드를 XHTML로 처리합니다.
character-set : 사용할 문자셋입니다.
허용되는 값은 다음과 같습니다.
UTF-8 : 기본값. ASCII 호환 멀티바이트 8비트 유니코드
ISO-8859-1 : 서유럽어권 문자셋
ISO-8859-15 : 서유럽어권 문자셋 (ISO-8859-1에 없던 유로화 기호와 프랑스어·핀란드어 문자 추가)
cp866 : DOS 전용 키릴 문자셋
cp1251 : Windows 전용 키릴 문자셋
cp1252 : Windows용 서유럽어권 문자셋
KOI8-R : 러시아어 문자셋
BIG5 : 번체 중국어, 주로 대만에서 사용
GB2312 : 간체 중국어, 중국 국가 표준 문자셋
BIG5-HKSCS : 홍콩 확장이 포함된 Big5
Shift_JIS : 일본어 문자셋
EUC-JP : 일본어 문자셋
MacRoman : Mac OS에서 사용되던 문자셋
double_encode : 이미 존재하는 HTML 엔티티를 다시 인코딩할지 여부를 지정하는 불리언(Boolean) 값입니다.
TRUE : 기본값. 모든 문자를 변환합니다.
FALSE : 기존 HTML 엔티티는 인코딩하지 않습니다.
반환값(Return Value)
htmlspecialchars() 함수는 변환이 완료된 문자열을 반환합니다.
예제(Example)
다음은 htmlspecialchars() 함수의 사용 예제입니다.
<?php
$res = htmlspecialchars("<a href='mylink'><strong>Demo</strong></a>", ENT_QUOTES);
echo $res;
?>
실행 결과(Output)
<a href='mylink'><strong>Demo</strong></a>
위 실행 결과에서 확인할 수 있듯이, ENT_QUOTES 옵션을 지정하면 큰따옴표뿐 아니라 작은따옴표(')까지 함께 변환됩니다. 이처럼 htmlspecialchars() 함수는 HTML 구조를 깨뜨릴 수 있는 특수 문자를 안전한 엔티티 형태로 바꿔주므로, 게시판·댓글 등 사용자 입력을 그대로 출력해야 하는 상황에서 활용하면 보안성을 크게 높일 수 있습니다.