Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
tinyxml — CVE-2021-42260 및 CVE-2023-34194 수정 사항이 포함된 TinyXML 2.6.2 | Kitploit
도구/GitHubGitHub/vm2mv/tinyxml
General Purpose UtilitiesStatic AnalysisCode AnalysisUtilities & Frameworks
GitHubvm2mv/tinyxml

tinyxml

CVE-2021-42260 및 CVE-2023-34194 수정 사항이 포함된 TinyXML 2.6.2

저장소 보기웹사이트
1161년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

/** @mainpage

TinyXML

TinyXML은 다른 프로그램에 쉽게 통합할 수 있는 단순하고 작은 C++ XML 파서입니다.

기능

간단히 말해, TinyXML은 XML 문서를 파싱하여 읽고, 수정하고, 저장할 수 있는 DOM(Document Object Model)을 구축합니다.

XML은 "eXtensible Markup Language"의 약자입니다. XML을 사용하면 자신만의 문서 마크업을 만들 수 있습니다. HTML이 브라우저용 문서를 마크업하는 데 아주 훌륭한 역할을 하는 반면, XML은 예를 들어 일정 관리 애플리케이션용 "할 일(to do)" 목록을 설명하는 문서와 같은 모든 종류의 문서 마크업을 정의할 수 있게 해줍니다. XML은 매우 구조화되고 편리한 형식입니다. 애플리케이션 데이터를 저장하기 위해 만들어졌던 그 모든 임의의 파일 형식은 XML로 대체될 수 있습니다. 모든 것을 위한 하나의 파서입니다.

완전하고 정확하며 솔직히 읽기 어려운 사양에 대한 가장 좋은 자료는 http://www.w3.org/TR/2004/REC-xml-20040204/에 있습니다. XML에 대한 입문서(제가 정말 좋아하는)는 http://skew.org/xml/tutorial에서 찾을 수 있습니다.

XML 데이터에 접근하고 상호 작용하는 방법에는 여러 가지가 있습니다. TinyXML은 DOM(Document Object Model)을 사용합니다. 즉, XML 데이터가 탐색하고 조작할 수 있는 C++ 객체로 파싱된 다음 디스크나 다른 출력 스트림에 기록됩니다. 또한 C++ 객체로 XML 문서를 처음부터 새로 구성하여 디스크나 다른 출력 스트림에 기록할 수도 있습니다.

TinyXML은 쉽고 빠르게 배울 수 있도록 설계되었습니다. 헤더 2개와 cpp 파일 4개로 구성되어 있습니다. 이 파일들을 프로젝트에 추가하기만 하면 바로 사용할 수 있습니다. 시작하는 데 도움이 되는 예제 파일(xmltest.cpp)이 포함되어 있습니다.

TinyXML은 ZLib 라이선스로 배포되므로 오픈 소스 또는 상용 코드에서 사용할 수 있습니다. 라이선스의 자세한 내용은 모든 소스 파일의 상단에 있습니다.

TinyXML은 유연한 파서이면서도 진정으로 정확하고 규격에 맞는 XML 출력을 제공하려고 합니다. TinyXML은 C++ 규격을 합리적으로 준수하는 모든 시스템에서 컴파일되어야 합니다. 예외나 RTTI에 의존하지 않습니다. STL 지원 유무에 관계없이 컴파일할 수 있습니다. TinyXML은 UTF-8 인코딩과 처음 64k 문자 엔티티를 완전히 지원합니다.

지원하지 않는 기능

TinyXML은 DTD(Document Type Definitions)나 XSL(eXtensible Stylesheet Language)을 파싱하거나 사용하지 않습니다. 훨씬 더 완전한 기능을 갖춘 다른 파서들(www.sourceforge.org에서 XML을 검색해 보세요)이 있습니다. 하지만 그것들은 훨씬 더 크고, 프로젝트에 설정하는 데 시간이 더 오래 걸리며, 학습 곡선이 더 가파르고, 종종 더 제한적인 라이선스를 가지고 있습니다. 브라우저를 다루거나 더 완전한 XML 요구 사항이 있다면 TinyXML은 적합한 파서가 아닙니다.

다음 DTD 구문은 현재 TinyXML에서 파싱되지 않습니다:

@verbatim ]> @endverbatim

TinyXML이 이를 불법적으로 !ELEMENT 노드가 포함된 !DOCTYPE 노드로 보기 때문입니다. 이 문제는 향후 해결될 수 있습니다.

튜토리얼.

급한 분들을 위해 시작할 수 있는 튜토리얼이 있습니다. 시작하는 데 아주 좋은 방법이지만, 이 (아주 짧은) 매뉴얼을 완전히 읽어볼 가치가 있습니다.

  • @subpage tutorial0

코드 상태.

TinyXML은 성숙하고 테스트된 코드입니다. 매우 안정적입니다. 버그를 발견하면 sourceforge 웹 사이트(www.sourceforge.net/projects/tinyxml)에 버그 리포트를 제출해 주세요. 가능한 한 빨리 해결하겠습니다.

개선할 영역이 몇 가지 있습니다. TinyXML 작업에 관심이 있다면 sourceforge를 확인해 주세요.

관련 프로젝트

유용하게 사용할 수 있는 TinyXML 프로젝트들입니다! (설명은 각 프로젝트에서 제공했습니다.)

  • TinyXPath (http://tinyxpath.sourceforge.net). TinyXPath는 C++로 작성된 작은 규모의 XPath 구문 디코더입니다.
  • TinyXML++ (http://code.google.com/p/ticpp/). TinyXML++는 C++의 많은 장점을 사용하는 완전히 새로운 TinyXML 인터페이스입니다. 템플릿, 예외, 그리고 훨씬 더 나은 오류 처리를 제공합니다.

특징

STL 사용

TinyXML은 STL을 사용하거나 사용하지 않도록 컴파일할 수 있습니다. STL을 사용하는 경우 TinyXML은 std::string 클래스를 사용하며 std::istream, std::ostream, operator<<, operator>>를 완전히 지원합니다. 많은 API 메서드에는 'const char*' 및 'const std::string&' 형식이 모두 있습니다.

STL 지원이 컴파일에서 제외되면 STL 파일은 전혀 포함되지 않습니다. 모든 문자열 클래스는 TinyXML 자체에서 구현됩니다. API 메서드는 입력에 모두 'const char*' 형식을 사용합니다.

컴파일 타임 #define을 사용하세요:

TIXML_USE_STL

이것으로 한 버전 또는 다른 버전을 컴파일할 수 있습니다. 이는 컴파일러로 전달하거나 "tinyxml.h"의 첫 줄로 설정할 수 있습니다.

참고: Linux에서 테스트 코드를 컴파일하는 경우 환경 변수 TINYXML_USE_STL=YES/NO를 설정하면 STL 컴파일이 제어됩니다. Windows 프로젝트 파일에는 STL 및 비 STL 대상이 제공됩니다. 프로젝트에서는 tinyxml.h의 첫 줄에 "#define TIXML_USE_STL" 줄을 추가하는 것이 아마 가장 쉬울 것입니다.

UTF-8

TinyXML은 UTF-8을 지원하므로 모든 언어의 XML 파일을 조작할 수 있습니다. TinyXML은 또한 "레거시 모드"(UTF-8 지원 이전에 사용되던 인코딩으로, "확장 ascii"라고 설명하는 것이 가장 적절할 것입니다)를 지원합니다.

일반적으로 TinyXML은 올바른 인코딩을 감지하여 사용하려고 시도합니다. 그러나 헤더 파일에서 TIXML_DEFAULT_ENCODING 값을 설정하면 TinyXML이 항상 하나의 인코딩을 사용하도록 강제할 수 있습니다.

TinyXML은 다음 중 하나가 발생할 때까지 레거시 모드를 가정합니다:

  1. 비표준이지만 일반적인 "UTF-8 선행 바이트"(0xef 0xbb 0xbf)가 파일 또는 데이터 스트림을 시작하면 TinyXML은 이를 UTF-8로 읽습니다.
  2. 선언 태그가 읽히고 encoding="UTF-8"이 있으면 TinyXML은 이를 UTF-8로 읽습니다.
  3. 선언 태그가 읽히고 인코딩이 지정되지 않으면 TinyXML은 이를 UTF-8로 읽습니다.
  4. 선언 태그가 읽히고 encoding="something else"가 있으면 TinyXML은 이를 레거시 모드로 읽습니다. 레거시 모드에서 TinyXML은 이전처럼 작동합니다. 이 모드가 정확히 무엇을 하는지는 명확하지 않지만, 이전 콘텐츠는 계속 작동해야 합니다.
  5. 위 기준 중 하나가 충족될 때까지 TinyXML은 레거시 모드로 실행됩니다.

인코딩이 잘못 설정되거나 감지되면 어떻게 될까요? TinyXML은 제대로 인코딩되지 않은 것으로 보이는 텍스트를 읽고 통과시키려고 시도합니다. 이상한 결과나 깨진 문자가 나타날 수 있습니다. TinyXML을 올바른 모드로 강제해야 할 수도 있습니다.

LoadFile( TIXML_ENCODING_LEGACY ) 또는 LoadFile( filename, TIXML_ENCODING_LEGACY )를 사용하여 TinyXML을 레거시 모드로 강제할 수 있습니다. TIXML_DEFAULT_ENCODING = TIXML_ENCODING_LEGACY를 설정하면 항상 레거시 모드를 사용하도록 강제할 수 있습니다. 마찬가지로 동일한 방법으로 TIXML_ENCODING_UTF8로 강제할 수 있습니다.

영어 사용자의 경우, 영어 XML을 사용할 때 UTF-8은 low-ASCII와 동일합니다. UTF-8을 인지하거나 코드를 변경할 필요가 없습니다. UTF-8을 ASCII의 "상위 집합"으로 생각할 수 있습니다.

UTF-8은 더블 바이트 형식이 아닙니다. 그러나 Unicode의 표준 인코딩입니다! TinyXML은 현재 wchar, TCHAR 또는 Microsoft의 _UNICODE를 사용하거나 직접 지원하지 않습니다. "Unicode"라는 용어가 유니코드의 와이드 바이트 인코딩인 UTF-16을 잘못 지칭하는 경우가 흔합니다. 이것은 혼란의 원인입니다.

"고 ASCII" 언어(영어가 아닌 거의 모든 언어)의 경우, TinyXML은 XML이 UTF-8로 인코딩되어 있는 한 모든 언어를 동시에 처리할 수 있습니다. 이것은 약간 까다로울 수 있습니다. 오래된 프로그램과 운영 체제는 "기본" 또는 "기존" 코드 페이지를 사용하는 경향이 있습니다. 많은 앱(그리고 거의 모든 최신 앱)은 UTF-8을 출력할 수 있지만, 오래되었거나 고집스러운(또는 그냥 손상된) 앱은 여전히 기본 코드 페이지로 텍스트를 출력합니다.

예를 들어, 일본어 시스템은 전통적으로 SHIFT-JIS 인코딩을 사용합니다. SHIFT-JIS로 인코딩된 텍스트는 TinyXML이 읽을 수 없습니다. 좋은 텍스트 편집기는 SHIFT-JIS를 가져온 다음 UTF-8로 저장할 수 있습니다.

Skew.org 링크는 인코딩 문제를 잘 다루고 있습니다.

테스트 파일 "utf8test.xml"은 영어, 스페인어, 러시아어 및 중국어 간체가 포함된 XML입니다. (올바르게 번역되었기를 바랍니다.) "utf8test.gif" 파일은 IE에서 렌더링된 XML 파일의 화면 캡처입니다. 시스템에 올바른 글꼴(중국어 간체 또는 러시아어)이 없으면 올바르게 파싱할 수 있더라도 GIF 파일과 일치하는 출력을 볼 수 없습니다. 또한 (적어도 제 Windows 머신에서는) 콘솔 출력이 서양 코드 페이지에 있어서 Print() 또는 printf()가 파일을 올바르게 표시할 수 없습니다. 이것은 TinyXML의 버그가 아니라 단지 OS 문제입니다. TinyXML에 의해 데이터가 손실되거나 손상되지 않습니다. 콘솔이 UTF-8을 렌더링하지 않을 뿐입니다.

엔티티

TinyXML은 미리 정의된 "문자 엔티티", 즉 특수 문자를 인식합니다. 즉:

@verbatim & & < < > > " " ' ' @endverbatim

이것들은 XML 문서를 읽을 때 인식되어 해당 UTF-8 등가물로 변환됩니다. 예를 들어, XML이 다음과 같은 텍스트는

@verbatim Far & Away @endverbatim

TiXmlText 객체에서 쿼리하면 Value()가 "Far & Away"가 되며, XML 스트림/파일에 앰퍼샌드로 다시 기록됩니다. 이전 버전의 TinyXML은 문자 엔티티를 "보존"했지만, 최신 버전은 문자로 변환합니다.

또한 모든 문자는 유니코드 코드 포인트로 지정할 수 있습니다. 구문 " " 또는 " "은 둘 다 줄 바꿈 없는 공백 문자입니다.

출력

TinyXML은 각각 장점과 한계가 있는 여러 가지 방법으로 출력할 수 있습니다.
  • Print( FILE* ). 모든 C 파일과 stdout을 포함하는 std-C 스트림으로 출력합니다.

    • "예쁘게 출력"하지만 출력 옵션을 제어할 수는 없습니다.
    • 출력이 FILE 객체로 직접 스트리밍되므로 TinyXML 코드에 메모리 오버헤드가 없습니다.
    • Print() 및 SaveFile()에서 사용됩니다.
  • operator<<. C++ 스트림으로 출력합니다.

    • 표준 C++ iostream과 통합됩니다.
    • 줄 바꿈 없는 "네트워크 출력" 모드로 출력합니다. 네트워크 전송 및 C++ 객체 간 XML 이동에 좋지만, 사람이 읽기에는 어렵습니다.
  • TiXmlPrinter. std::string 또는 메모리 버퍼로 출력합니다.

    • API가 덜 간결합니다.
    • 향후 출력 옵션이 여기에 추가될 예정입니다.
    • 출력은 개선되고 확장됨에 따라 향후 버전에서 약간 변경될 수 있습니다.

스트림

TIXML_USE_STL이 켜져 있으면 TinyXML은 C++ 스트림(operator <<, >>)뿐만 아니라 C(FILE*) 스트림도 지원합니다. 알고 있어야 할 몇 가지 차이점이 있습니다.

C 스타일 출력: - FILE* 기반 - Print() 및 SaveFile() 메서드

가능한 한 사람이 읽기 쉽도록 충분한 공백이 있는 형식화된 출력을 생성합니다. 매우 빠르고 잘못 구성된 XML 문서에 관대합니다. 예를 들어, 2개의 루트 요소와 2개의 선언을 포함하는 XML 문서도 여전히 출력됩니다.

C 스타일 입력: - FILE* 기반 - Parse() 및 LoadFile() 메서드

빠르고 관대한 읽기입니다. C++ 스트림이 필요하지 않을 때마다 사용하세요.

C++ 스타일 출력: - std::ostream 기반 - operator<<

가독성보다는 네트워크 전송을 위한 압축된 출력을 생성합니다. 시스템의 ostream 클래스 구현에 따라 다소 느릴 수 있습니다. (또는 아닐 수도 있습니다.) 잘못 구성된 XML에는 관대하지 않습니다. 문서에는 올바른 루트 요소가 하나 있어야 합니다. 추가 루트 수준 요소는 스트림으로 출력되지 않습니다.

C++ 스타일 입력: - std::istream 기반 - operator>>

스트림에서 XML을 읽으므로 네트워크 전송에 유용합니다. 까다로운 부분은 스트림에 다른 데이터가 거의 확실히 있기 때문에 XML 문서가 완료된 시점을 아는 것입니다. TinyXML은 루트 요소를 읽은 후 XML 데이터가 완료된 것으로 간주합니다. 다시 말해, 루트 요소가 두 개 이상인 잘못 구성된 문서는 올바르게 읽히지 않습니다. 또한 operator>>는 STL 구현과 TinyXML의 한계 때문에 Parse보다 다소 느립니다.

공백

세상은 공백을 유지해야 하는지 압축해야 하는지에 대해 단순히 의견이 일치하지 않습니다. 예를 들어, '_'가 공백이라고 가정하고 "Hello____world"를 보십시오. HTML 및 적어도 일부 XML 파서는 이를 "Hello_world"로 해석합니다. 그들은 공백을 압축합니다. 일부 XML 파서는 그렇지 않으며 "Hello____world"로 남겨 둡니다. (_가 공백이라고 계속 가정하는 것을 기억하세요.) 다른 사람들은 __Hello___world__가 Hello___world가 되어야 한다고 제안합니다.

이것은 제가 만족할 만큼 해결되지 않은 문제입니다. TinyXML은 처음 2가지 접근 방식을 지원합니다. 원하는 동작을 설정하려면 TiXmlBase::SetCondenseWhiteSpace( bool )를 호출하세요. 기본값은 공백을 압축하는 것입니다.

도구 다운로드