[PHP] 문자열 데이터에서 특수문자를 HTML 엔티티로 변환하는 방법

folder 프로그래밍 calendar_month web_traffic 0

지난 포스트에서 POST 형식으로 Input 태그의 데이터를 받을 때 특수 문자를 깨끗하게 만드는 방법을 기록으로 남겨둔 적이 있는데요.

위 방법은 POST 형식으로 데이터를 주고 받을 때 한정적으로 사용할 수 있는 방법이고, 일반적인 상황에서도 특수문자가 포함된 문자열 데이터를 변수에 담아 처리할 때 이스케이프 문자, 즉, 역슬래시 \ 가 붙는 경우가 있어 이를 해결할 수 있는 방법을 찾아 보았습니다.

문제

일단 어떤 상황인지 아래 예시 상황을 보시죠.

$text = "It's on time";

위와 같은 경우에 문자열을 처리하다 보면 $text 변수의 값이 It\'s on time으로 표시되는 경우가 왕왕 발생할 것입니다. 물론 이는 PHP 언어에서 SQL 인젝션1을 방지하기 위해서, 안전을 위해 처리한 결과물이라고 보면 되는데, 사용자 입장에서는 조금 불편한 것은 사실입니다.

해결

위 예시에서 It's on time을 웹 상에서 정확히 It's on time으로 안전하게 표시하기 위해 아래와 같은 과정을 거치면 됩니다.

  1. 문자열에서 역슬래시 \ 제거
  2. 특수문자 '를 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 문서를 보고 본인에게 맞는 옵션을 선택하면 됩니다.

끝.


  1. 웹 어플리케이션에서 데이터를 주고 받을 때 악의적으로 SQL 쿼리를 집어 넣어, 권한 없이 데이터베이스에 접근해 데이터를 조작, 탈취하는 공격 

댓글 남기기