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.etree.ElementTree": ElementTree API、シンプルで軽量な XML プロ
  セッサ

* "xml.dom": DOM API の定義

* "xml.dom.minidom": 最小限の DOM の実装

* "xml.dom.pulldom": 部分的な DOM ツリー構築のサポート

* "xml.sax": SAX2 基底クラスと便利関数群

* "xml.parsers.expat": Expat parser バインディング

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

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**
   として知られています。
