[PHP] 문자열 데이터에서 특수문자를 HTML 엔티티로 변환하는 방법
지난 포스트에서 POST
형식으로 Input
태그의 데이터를 받을 때 특수 문자를 깨끗하게 만드는 방법을 기록으로 남겨둔 적이 있는데요.
위 방법은 POST
형식으로 데이터를 주고 받을 때 한정적으로 사용할 수 있는 방법이고, 일반적인 상황에서도 특수문자가 포함된 문자열 데이터를 변수에 담아 처리할 때 이스케이프 문자, 즉, 역슬래시 \
가 붙는 경우가 있어 이를 해결할 수 있는 방법을 찾아 보았습니다.
문제
일단 어떤 상황인지 아래 예시 상황을 보시죠.
$text = "It's on time";
위와 같은 경우에 문자열을 처리하다 보면 $text
변수의 값이 It\'s on time
으로 표시되는 경우가 왕왕 발생할 것입니다. 물론 이는 PHP 언어에서 SQL 인젝션1을 방지하기 위해서, 안전을 위해 처리한 결과물이라고 보면 되는데, 사용자 입장에서는 조금 불편한 것은 사실입니다.
해결
위 예시에서 It's on time
을 웹 상에서 정확히 It's on time
으로 안전하게 표시하기 위해 아래와 같은 과정을 거치면 됩니다.
- 문자열에서 역슬래시
\
제거 - 특수문자
'
를 HTML 엔티티의'
로 변환
이 과정을 거치기 위해 우리는 아래와 같이 PHP 내장 함수를 사용하면 됩니다.
$text = "It's on time";
$sanitized = htmlspecialchars( stripcslashes( $text ), ENT_QUOTES );
이렇게 되면 $sanitized
변수에는 It's on time
라는 String 타입의 데이터가 담기게 되는데, 웹 상에서는 It's on time
이라고 표시됩니다.
여기서 사용된 두 함수에 대해 간단하게 정리하자면 아래와 같습니다.
stripcslashes
:String
타입의 데이터에서 이스케이프 문자를 제거htmlspecialchars
:String
타입의 데이터에서 특수문자를 HTML 엔티티로 변환
여기서 htmlspecialchars
함수는 htmlentities
함수로 대체할 수 있습니다. 두 함수의 커버 범위를 비교하자면 htmlentities
쪽이 더 넓다고 할 수 있습니다.
또한 두 함수의 특수문자 커버 범위는 위 예제에 있는 ENT_QUOTES
로 설정할 수 있습니다. 아래 링크에 있는 PHP.net 문서를 보고 본인에게 맞는 옵션을 선택하면 됩니다.
링크
- stripcslashes, PHP.net
- htmlspecialchars, PHP.net
끝.
- 웹 어플리케이션에서 데이터를 주고 받을 때 악의적으로 SQL 쿼리를 집어 넣어, 권한 없이 데이터베이스에 접근해 데이터를 조작, 탈취하는 공격 ↩