개발&Development/프로그래밍 일반

Escaping String

겐도 2007. 8. 14. 07:11

CDATA : <![CDATA[ ... ]]>

스트링 노테이션은 언어를 처음 접할때 찾아보게 되는 중요한 요소중 하나이자 실제 프로그래밍에서도 까다로운 부분임에 틀림없다. SQL Injection 공격도 결국 인자로 받는 데이터를 어떻게 안전하게 이스케이핑 해서 전달하느냐의 문제이고, 블로그에서 댓글을 어떻게 잘 표현할 것인가에 대한 문제기도 하다. 실제로 지금 현재 TextCube 1.5는 댓글이 두번 이스케이핑이 되어 '&'가 '&amp;'로 나온다거나 쌍따옴표(")가 '&quot;'로 나오는 문제가 있다. 수정중이긴 하지만 MySQL, PHP, HTML, JavaScript까지의 연타 상황에서는 쉬운 문제만은 아니다. G-Test도 결국 그런 이유에서 나온 테스트 패턴이다. TextCube Wiki에도 나와 있는 코딩 가이드라인에 이런 내용부터 들어간 것이 그런 이유기도 하다.

태터에서(태터툴즈 시절) 머리 아팟던 이스케이핑 문제중 하나가 more/less 기능이었다. 자바스크립트로 다시 확장/축소를 할 수 있는 자바스크립트를 만드는 문제였다. 조금만 실수해도 스크립트가 쏟아지거나 반대로 너무 이스케이핑 되어서 나와 버린다. 처음에 구현되었을 때 특수문자에 대한 핸들링 문제가 있어서 이스케이핑 처리하는데 며칠동안 머리 쥐어 뜯으면서 고민했던 기억이 난다.

최근에 RSS 스킨을 보면서 누군가(?) 왜 많은 XML 데이터 부분에서 CDATA로 감싸지 않고 일일이 이스케이핑하면서 고생했나라고 이야기 했는데 그에 대해 본인의 답변은 그렇게 해도 "]]>" 이스케이핑 해야 된다였다. xml element 노테이션상 이스케이핑 고생하다가 CDATA로 감싸면 만사 오케이 아닌가라고 생각할 수 있겠지만 모든 표현 방식은 항상 구분자를 가질 수 밖에 없고 데이터중에 그것을 가지는 방법을 고민해야 한다. 즉 태터의 경우 단순히 CDATA로 RSS를 출력한다 해도 지금까지 htmlspecialchars 날려준 것 처럼 CDATA Escaping을 처리해 줘야 한다. 세상은 그리 호락호락 하지 않은 것이다.

자 그럼 본격적으로.. CDATA에서 "]]>"는 어떻게 처리해야 할까. 사실 CDATA에서는 목적이 이스케이핑 없이 텍스트 데이터를 표현하기 위해서이다 보니 마땅한 이스케이핑 방법이 없다. 우선 방법1. CDATA를 안쓴다. 간단한 스크립트 쓰는데 걍 잘써봐라 하는 내용들이 구글 검색해 보면 줄줄이 올라온다. 이런 앙큼쟁이들. 그나마 쓸만한 방법은 http://en.wikipedia.org/wiki/CDATA#Uses_of_CDATA_sections. 잘 읽어보면 결국은 벼룩 잡으려다 초가산간 태우는 이스케이핑을 해야 한다;;;;

태터는 잘 될까? G-Test를 풀리 통과하기란 매우 어렵다. 단순히 내장을 안쏟는 것이 아니라 해당 데이터를 정확히 표현까지 해야 되어 모든 부분을 신경 쓰기란 만만치 않다. more/less 구현할때 생각하면 아직도 뒷머리가 땡겨온다.

갑자기 왜 이런글을 쓸까나? 사실 위에서도 언급하였듯 RSS를 왜 CDATA를 안썼냐고 하는 이야기도 기억나고, 제로보드 보니 글쓸때 xml로 날려주시는데 "]]>"가 포함되면 역시나 오동작을 해 주셔서 버그보고 하러 갈려 그랬는데 회원가입 귀찮고 등등등. 태터도 그렇듯 이렇게 휘갈겨 두면 누군가 보고해 주겠죠. 근데 TextCube는 언제 점검하지;;;; 아무튼 스트링 핸들링은 최근처럼 여러 레이어에서 다른 언어로 처리해야 하는 경우 매우 중요한 포인트라는 것을 남기면서.

'개발&Development > 프로그래밍 일반' 카테고리의 다른 글

PHPUnit에서 Trac까지  (1) 2007.10.29
Greatest problem in computing today  (1) 2007.10.01
BSI - Bug Scene Inspector  (1) 2007.08.03
글자 크기  (4) 2007.07.31
코더로서 적응해 간다는 것  (20) 2007.06.20