XMLパーサは、実用レベルから習作レベルまで、雨後の筍ほどもある。C++で使えるライブラリを探した。
XML関係の仕様は, XSLT, XQuery, XLink, XPointer, XPath などがある。XLink, XPointer は XBRL で使われている。DocBook v5 は XLink, XInclude を使っている。SVG 1.1 は XLink を使っている。
XMLパーサは, これらの仕様のうちアプリケイションの基礎となるものについて、最低限 XPath ぐらいは備えていてほしい。
XSLT, XPath, XQuery は組み合わせがある。
XSLT | XPath | XQuery |
---|---|---|
XSLT 3.0 (2017-06-08) | XPath 3.1 (2017-03-21) | XQuery 3.1 (2017-03-21) |
XSLT 2.0 or XSLT 3.0 | XPath 3.0 (2014-04-08) | XQuery 3.0 (2014-04-08) |
XSLT 2.0 (2007-01-23). 2nd 2021-03-30. | XPath 2.0 (2007-01-23). 2nd 2010-12-14. | XQuery 1.0 (2007-01-23). 2nd 2010-12-14. |
XQuery 3.0 は XPath 3.0 の拡張。XQuery 1.0 は XPath 2.0 の拡張。
ということで, 有力なものを以下に示す。後ろに選外も並べておく。
提供 | ライセンス |
---|---|
Saxonica社 | MPL 2.0 (Home Edition) |
HE (Home Edition), EE (Enterprise Edition) などがある。基本は Java, .NET 用で, それをC/C++向けにビルドしたもの。Saxon/C v1.2.1 は Saxon v9.9相当. Saxon 10 product comparison (Feature Matrix)
唯一の XSLT 3.0, XQuery 3.1 and XPath 3.1 フルサポート. XInclude.
DTD (カタログのカスタマイズ可) and XML Schema 1.0/1.1 validation. XML Schema サポートは Saxon-EE のみ.
公式サイトで Linux, MacOS, Windows バイナリを提供。CentOS 8 パッケージなし. Fedora 34 パッケージなし。Debian libsaxonhe-java のみ (C版がない)
信頼できないソースのXMLデータを扱うときは, 次を false
にする。
http://saxon.sf.net/feature/parserFeature?uri=http%3A//xml.org/sax/features/external-general-entities
http://saxon.sf.net/feature/parserFeature?uri=http%3A//xml.org/sax/features/external-parameter-entities
提供 | ライセンス |
---|---|
Apache | Apache Software License 2.0 |
DOM Level 3 and SAX 1.0/2.0, XInclude. DTD および XML Schema.
CentOS 8 xerces-c v3.2.2. Debian 11 libxerces-c-dev v3.2.3.
XPath は備えない。次と組み合わせる。最近は XQilla のほうがいいか。
信頼できないソースのXMLデータを使うときは, DTDを完全に無効化する (fgDOMDisallowDoctype
) か, 次のようにする.
XercesDOMParser
は AbstractDOMParser
から派生している。
XercesDOMParser *parser = new XercesDOMParser; parser->setCreateEntityReferenceNodes(true); // false のときに展開する. 紛らわしい. parser->setDisableDefaultEntityResolution(true);
SAXParser
(SAX 1.0; 古い) も設定変更する.
SAXParser* parser = new SAXParser; parser->setDisableDefaultEntityResolution(true);
SAX2XMLReader
(SAX2) はやり方が違う。デフォルト値は false
になっている。
SAX2XMLReader* reader = XMLReaderFactory::createXMLReader(); parser->setFeature(XMLUni::fgXercesDisableDefaultEntityResolution, true);
提供 | ライセンス |
---|---|
Arseny Kapoulkine氏 | MIT License |
DTD or XML Schema 検証は含まない (non-validating のみ)。実体参照 entity reference のカスタマイズも不能。割り切った用途にはよい。
DOM-like interface. スピードが売り。Better than RapidXML. XPath 1.0. Full Unicode support.
CentOS 8 v1.11.4. Debian 11 v1.11.4
提供 | ライセンス |
---|---|
Daniel Veillard氏 | MIT License |
Plain Cだが、幅広く使われているので、挙げておく。
XPath 1.0. DTDのみサポートで XML Schema は未対応。
libxslt が libxml2 を使っている。Ruby Nokogiri requires libxml2 and libxslt.
CentOS 8 libxml2 v2.9.7, libxslt v1.1.32. Debian 11 libxslt1-dev v1.1.34
信頼できないソースのXML データを使うときは, options として次を指定しないようにする. DTDの無効化はできないかな?
XML_PARSE_DTDLOAD
Load the external subset
XML_PARSE_NOENT
Substitute entities
Poco::XML
名前空間. Node
インタフェイスの getNodeByPath()
メソッド, getNodeByPathNS()
メソッドで simplified XPath expression をサポート。
POCO は openFrameworks の一部になっている。独立した多数のライブラリを組み合わせるより、調整されたフレームワークを使うのは、悪くない選択。
"We replaced a rapidxml parser and not only is libstudxml much faster, but the code is so much clearer."
MIT License. XPath サポートなし。
もともとは James Clark 作 (v1.2まで). A stream-oriented XML parser library written in C. XPath サポートはなさそう。
CentOS 8 expat-2.2.5. v2.2.0 までは 外部 DTD サブセットの処理に脆弱性がある。[CVE-2017-9233 サンプル付き]
広く使われていて、現在でもメンテナンスされている。しかしながら, ライブラリを作るための基盤として使うもので、直接使うようなものではなさそう。
XML Vulnerabilities and Attacks cheatsheet XML脆弱性の一覧とサンプル.
XML Based Attacks - OWASP Server Side Request Forgery (SSRF) attack はリソースにアクセスしただけで発生。これはヤバい。
XML External Entity Prevention - OWASP Cheat Sheet Series 各実装での設定。
●●後で確認: REXML の脆弱性: #1104077 Round-trip instability in REXML, 1947526 - CVE-2021-28965 ruby: XML round-trip vulnerability in REXML