XMLを扱うモジュール群

ソースコード: Lib/xml/


PythonのXMLを扱うインターフェースは xml パッケージにまとめられています。

注釈

信頼できないデータや、認証されていないデータを解析する場合は、XML のセキュリティ を参照してください。

xml パッケージのモジュールを使うには、SAX に準拠した XML パーザが少なくとも 1 つ利用できる必要があります。 Expat パーザは Python に含まれているため、xml.parsers.expat モジュールは常に利用できます。

xml.dom および xml.sax パッケージのドキュメントは Python による DOM および SAX インターフェースへのバインディングに関する定義です。

XML に関連するサブモジュール:

このモジュールはユーティリティ関数も定義しています。

xml.is_valid_name(name)

文字列が有効な要素名または属性名なら True、そうでなければ False を返します。

制御文字と、区切り文字として使われる文字や使われ得る文字を除き、ほぼすべての文字を名前に使えます。 「:」「-」「.」「_」「·」などは使えますが、「<」「/」「!」「?」「=」は禁止されています。 名前の先頭には、数字や「-」「.」「·」などの文字を使えません。

Added in version 3.15.

xml.is_valid_text(data)

文字列が XML 1.0 で許可される文字だけからなる場合は True、そうでなければ False を返します。

XML 1.0 文書では、C0 制御文字 (TAB、CR、LF を除く)、サロゲート文字、特殊な Unicode 文字 U+FFFE と U+FFFF を除き、ほぼすべての文字を使えます。

Added in version 3.15.

XML のセキュリティ

Python などで攻撃者が制御する XML を解析する際、攻撃者は XML の機能を悪用して、 サービス拒否攻撃、ローカルファイルへのアクセス、他のマシンへのネットワーク接続、ファイアウォールの迂回を行うことができます。

Python に組み込まれた XML パーザは、一般に Expat と呼ばれる libexpat ライブラリを使って XML を解析します。

デフォルトでは、Expat 自体がローカルファイルにアクセスしたり、ネットワーク接続を作成したりすることはありません。

2.7.2 より前の Expat には、「billion laughs」「quadratic blowup」「large tokens」の脆弱性や、動的メモリを不釣り合いに大量消費する問題がある可能性があります。 Python には Expat が同梱されていますが、同梱版とシステム全体にインストールされた版のどちらを使うかは、 その環境の Python インタープリタの 構成 によって決まります。 こうした古いバージョンの Expat を使っている場合、Python も脆弱性の影響を受ける可能性があります。 pyexpat.EXPAT_VERSION を確認してください。

xmlrpc は「解凍爆弾」攻撃に対して 脆弱です。

billion laughs / exponential entity expansion

Billion Laughs 攻撃 -- または指数関数的エンティティ展開 (exponential entity expansion) -- は複数階層の入れ子になったエンティティを使用します。 各エンティティは別のエンティティを複数回参照し、最終的なエンティティの定義は短い文字列です。 指数関数的に展開されることで数 GB のテキストができ、多くのメモリと CPU 時間を消費します。

quadratic blowup entity expansion

二次爆発攻撃 (quadratic blowup attack) はエンティティ展開を悪用する点で Billion Laughs 攻撃に似ています。 入れ子になったエンティティの代わりに、この攻撃は数千字の大きなエンティティを何度も繰り返します。 この攻撃は指数関数的なものほど効率的ではありませんが、パーザの深い入れ子になったエンティティを禁止する対抗手段をすり抜けます。

decompression bomb

解凍爆弾 (あるいは ZIP 爆弾) は、gzip 圧縮 HTTP ストリームや LZMA 圧縮ファイルなどの圧縮された XML ストリームをパースできる全ての XML ライブラリに対し行われます。 攻撃者は送信データ量を1,000 分の 1 以下に減らすことができます。

大きなトークン

Expat は未完了のトークンを再解析する必要があります。 Expat 2.6.0 で導入された防御策がない場合、実行時間が入力サイズの二乗に比例して増大する可能性があり、 XML を解析するアプリケーションに対するサービス拒否攻撃に悪用されることがあります。 この問題は CVE 2023-52425 として知られています。