
서버에 제공된 값이 페이지에 표시될 때, 해커가 이 값을 사용하여 악성 스크립트를 실행할 수 없도록 이 값을 이스케이핑 처리해야 한다.
데이터 이스케이핑에는 값에 나타나지 않아야 하는 모든 문자를 제거(선택적 교체)하는 직업이 포함된다. 예를 들어 HTML은 브라우저가 코드처럼 처리하는 다섯 개의 예약 문자가 있다.
페이지에서 이 다섯 개의 문자를 표시하려면 해당 문자를 나타내는 엔티티 이름이나 엔티티 번호로 바꿔야 한다. 그러면 브라우저는 해당 문자를 코드로 처리하지 않고 표시한다.
방문자로부터 값을 받아서 페이지에 그 값을 표시해야 할 때, 이 예약 문자를 확인하고 해당 엔티티로 바꿔야 한다. 이것은 PHP 내장 함수인 htmlspecialchars()를 사용해서 할 수 있다.
HTML의 예약 문자를 엔티티로 바꾸지 않으면, 해커가 악성코드가 포함된 자바스크립트 파일을 로드하는 값을 보낼 수 있다. 이것을 교차 사이트 스크립팅cross-site scripting, XSS 공격이라고 한다.
PHP의 내장 함수인 htmlspecialchars()는 HTML의 예약 문자를 각 해당하는 엔티티로 대체하여 문자가 코드로 실행되지 않고 표시되게 한다.
htmlspecialchar() 함수는 네 개의 매개변수를 갖는다. 첫 번째 매개변수는 필수고 나머지는 선택사항이다.
- $text : 이스케이핑하려는 텍스트다.
- $flag : 인코딩되는 문자를 제어하는 옵션이다.
ENT_COMPAT : 큰따옴표는 변환하고 작은따옴표는 그대로 둔다(디폴트).
ENT_QUOTES : 큰따옴표와 작은따옴표를 변환한다.
ENT_NOQUOTES : 큰따옴표나 작은따옴표를 변환하지 않는다.
ENT_SUBSTITUTE : 함수가 빈 문자열을 반환하는 것을 방지하기 위해, 유효하지 않은 문자를 대체 문자로 바꾼다.
ENT_HTML401 : 코드를 HTML 4.01로 취급한다.
ENT_HTML5 : 코드를 HTML 5로 취급한다.
ENT_XHTML : 코드를 XHTML로 취급한다.- $encoding : 문자열에서 사용되는 인코딩 스킴이다(디폴트 UTF-8).
- $double_encode : HTML 엔티티는 &로 시작하기 때문에 문자열에 엔티티가 포함되어 있으면 &가 인코딩되어 예약 문자가 아닌 엔티티가 표시되게 한다.
htmlspecialchars($text[, $flag][, $encoding][, $double_encode]);
만약에 이스케이핑된 문자열이 함수에서 사용되는 인코딩 스킴에 모두 유효한 문자로 구성되었다면, 함수는 예약 문자가 엔티티로 대체된 문자열을 반환한다.
문자열에 유효하지 않은 문자가 포함되어 있다면, 빈 문자열을 반환한다.
출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022