반응형 XML5 StAXParser를 이용한 DomTree 만들기 업무상 이유로 HTML 엔티티가 데이터로 포함되어 있는 XML 문서를 다룰 일이 있었다. XML에는 기본적으로 5개의 엔티티가 정의되어 있다. 그 외의 데이터는 DTD를 통해 선언을 해주거나 엔티티로 해석할 수 없도록 이스케이핑(Escaping)을 해줘야 한다. HTML 엔티티가 포함되어 있는 XML 문서를 파싱해서 DOM 트리를 사용해야 하는 경우 설정이 좀 까다로울 수가 있다. 이런저런 설정을 찾다가 StAXParser를 이용해서 DOM 트리를 만들어주는 코드를 작성해봤다. & 문자로 시작하는 엔티티를 해석하지 않고, 문자 그대로 사용하는 동작을 구현해봤다. (물론 실무에는 사용하지 않고 그냥 연습 코드로만 작성해봤다. 현실에서는 XML 문서에다가 이상한 엔티티 섞지말아달라고 생산자에게 안내를 해줘야.. 2019. 8. 9. XML External Entity Injection Attack (XXE Injection 공격) XML 파서를 사용하기 위해 구글링을 하다가 'XXE Injection Attack(XML External Entity Injection 공격)'에 대해서 알게되었다. XXE Injection 공격은 OWASP Top 10 - 2017에도 선정된 웹 애플리케이션 취약점이다. (OWASP는 The Open Web Application Security Project의 약자로 웹 애플리케이션에서 흔히 발생할 수 있는 대표적인 취약점을 모아서 4년마다 발표하는 프로젝트다.) 1. XML Entity XML 엔티티(Entity)는 반복적으로 나오는 문자열이나 특별처리가 필요한 특수 문자를 XML 문서에서 사용하기 위해 미리 정의해놓고 사용하는 개체다. XML Entity는 앰퍼샌드('&') 문자로 시작하고 세미콜.. 2019. 7. 10. Valid XML vs Well-formed XML XML 문서의 형식을 이야기할 때 'Well-formed XML'과 'Valid XML'이라는 구분을 하게 된다. Well-formed와 Valid는 어떻게 다른지 정리를 할 필요가 있다. 1. Well-formed XML XML은 W3C(Workdl Wide Web Consortium)이 정해놓은 표준이다. XML 표준을 보면 XML 문서가 어떻게 작성되어야 하는지 기술하고 있다. XML 문서는 반드시 하나의 루트 엘리먼트로부터 시작되어야 하며, 태그 이름은 숫자로 시작할 수 없고 정해진 문자만 포함할 수 있다는 등의 내용이 정리되어있다. XML에 포함되어 있는 데이터의 내용과 상관없이 XML 문법만 잘 지켜지면 'Well-formed XML'이라고 할 수 있다. 2. Valid XML 'Valid X.. 2019. 7. 8. [Java] SAXParser Exception - "[Fatal Error] :1:1: Premature end of file" SAX 파서를 이용한 라이브러리를 사용하다가 "[Fatal Error] :1:1: Premature end of file." 혹은 "[Fatal Error] :1:1: 예기치 않은 파일의 끝입니다."라는 Exception을 만나게 되는 경우가 있다. 이 예외는 SAX 파서의 입력 스트림이 예기치 않게 끝났을 경우에 발생한다. 대표적으로 SAX 파서에 빈 문자열을 입력하면 발생하게 된다. 다음 예제를 살펴보자. import java.io.StringReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.xml.sax.. 2019. 5. 30. [Java] org.w3c.dom.Node 클래스를 Document로 변환하기 XML의 특정 서브 트리의 Node 객체를 이용해서 해당 객체가 Root인 새로운 Document 를 만들고 싶을 때가 있다. 예를 들어 다음과 같은 XML Document가 있다고 하자. value 1 value 2 value 3 XPath 등을 이용해서 에 해당하는 Node 객체를 얻어왔을 때 노드의 서브 트리를 Root로 하는 새로운 Document를 얻어오고 싶을 경우가 있다. value 3 org.w3c.dom.Document 인터페이스에는 importNode() 라는 메소드가 있으며, 이 메소드를 이용해서 새로운 Document를 만들 수 있다. org.w3c.dom.Node 클래스를 Root로 하는 새로운 org.w3c.dom.Document를 만드는 예제 코드는 다음과 같다. public .. 2019. 5. 16. 이전 1 다음 반응형