3.05. html 이스케이프 하기

사용자가 입력한 html은 언제든지 XSS(Cross Site Scripting) 공격의 가능성이 있다. 이러한 공격에 대비하기 위해 html을 치환한다.

<?php

$html = <<<CDATA
A 'quote' is <b>bold</b> "한글" 데이터
CDATA;
$encode = htmlspecialchars($html);
echo $encode;echo PHP_EOL;

$decode = htmlspecialchars_decode($encode);
echo $decode;

위 코드를 escape.php 파일에 저장하고 브라우저에서 결과를 확인한다.
또한 브라우저에서 우클릭 후 소스보기(Ctrl + U) 를 눌러서 글자가 서로 다르게 나오는 것을 확인한다. 아래는 소스보기를 한 결과이다.

A 'quote' is &lt;b&gt;bold&lt;/b&gt; &quot;한글&quot; 데이터
A 'quote' is <b>bold</b> "한글" 데이터

HTML을 인코딩한 결과 $encode는 아래와 같이 출력된다.

A 'quote' is <b>bold</b> "한글" 데이터

소스보기로 보면 아래와 같다.

A 'quote' is &lt;b&gt;bold&lt;/b&gt; &quot;한글&quot; 데이터

HTML을 인코딩하지 않고 그대로 보여준 경우 $decode는 아래와 같이 보여진다.

A 'quote' is bold "한글" 데이터

소스보기로 보면 아래와 같다.

A 'quote' is <b>bold</b> "한글" 데이터

htmlspecialchars 함수는 html 에서 XSS 공격을 방어하기 위해 특수 문자를 인코딩한다. XSS 공격은 Cross Site Scripting 의 약자로 태그 등을 입력해서 서버의 보안 취약점을 노리는 공격이다.

html은 특수한 의미를 가지는 글자들(ex. 태그의 시작을 나타내는 <) 등도 일반 문자로 표현하기 위해 < 표시를 그대로 나타내고 싶으면 &lt; 로 쓰면 된다는 등의 치환 규칙이 있다. htmlspecialchars 는 이 규칙에 따라 html을 변환해 준다.

  • &  &amp; 로 변환된다.
  • "  &quot; 로 변환된다.
  • '  ENT_QUOTES 옵션을 함께 줄 때만 변환된다.
  • <  &lt; 으로 변환된다.
  • >  &gt; 으로 변환된다.

htmlspecialchars 와 비슷한 함수로 htmlentities 도 있는데 htmlentities 는 바꿀 수 있는 건 모두 바꾸므로 인코딩에 영향을 받는다. 가능하면 htmlspecialchars 를 사용하는 편이 좋다.

인코딩한 결과를 반대로 바꾸려면 디코딩 함수인 htmlspecialchars_decode 를 사용한다.