[1] 単独の[[ファイル]]となった[[実体]]のことを、[[外部実体]]といいます。
広義には[[文書実体]]や[[外部部分集合実体]]も含みますが、
狭義には[[実体宣言]]で[[宣言]]されるもののみを指します。

* 仕様書

[REFS[
- [16] [CITE@EN[Extensible Markup Language (XML) 1.0 (Fifth Edition)]] ([TIME[2013-05-29 05:49:56 +09:00]] 版) <http://www.w3.org/TR/xml/#dt-pubid>
]REFS]

* 分類

[2] XML の外部実体の種類と、その満たさないといけない構文規則:
,[[文書実体]]      ,[CODE(XML)[[[document]]]]
,[[外部部分集合]]  ,[CODE(XML)[extSubset]]
,[[宣言]]間で参照される[[外部引数実体]],[CODE(XML)[extSubsetDecl]]
,宣言中で参照される外部引数実体
,[[実体値]]中で参照される外部引数実体
,[[文書実現値]]内で参照される[[外部解析実体]],[CODE(XML)[extParsedEnt]]
,[[外部非解析実体]],(無制限)

* 取得

[17] [[XML処理器]]は、[[実体]]の[[内容]]を[RUBYB[取得]@en[[[retrieve]]]]する場合、
次のようにします [SRC[>>16]]。
[FIG(steps)[
= [18] [[公開識別子]]と[[システム識別子]]、および何らかの付加情報を使って、
[[URL]] を決定しようと試みて構いません。
= [19] >>18 によって決定しない、できない場合には、[[システム識別子]]の [[URL]]
を使わなければなりません。
]FIG]

;; [20] [[公開識別子]]と[[システム識別子]]の[[正規化]]については、
それぞれの項を参照。

[21] ここでいう“何らかの付加情報”について [[XML]] 仕様そのものでは特に規定がありませんが、
[[SGML]] 時代以来そのような対応情報ファイルのことを[[型録]]と呼んでいます。

;; [[実体解決器]]も参照。

[22] いくつかの [[XML処理器]]は [[XML Catalogs]] に対応しています。

;; [24] [[XML Catalogs]] では[[実体名]]も決定に使うことができます。

[23] [[Webブラウザー]]などの[[XML処理器]]においては [[HTML Standard]]
が規定する[[文字実体参照]]に関する[[公開識別子]]と
[CODE(URI)@en[[[data:]]]] [[URL]] の対応関係が実装されています。

;; [25] [[Webブラウザー]]の実装では[[参照]]される文脈も決定に使われます。

;; [[文字参照]]、[[XHTML名前付き文字参照DTD]]を参照。

* セキュリティーとプライバシー

[13] [[外部実体]]がその参照元と異なる場合など、[[外部実体]]を信用できない可能性がある場合には、
[[利用者]]や参照元の[[著者]]が想定していない悪意ある情報や指示が混入させられることがありますから、
配慮が必要です [SRC[>>9]]。

[14] [[外部実体]]による混入だけでなく、例えば[[外部実体]]へのアクセスの有無によって[[利用者]]が[[文書]]を開いたかどうかを判断するなどの[[プライバシー]]や[[セキュリティー]]に関わる想定外の利用方法もあり得ますから、注意しないといけません。

[15] [[Webブラウザー]]における [[XML]] の実装が[[外部実体]]を[[展開]]しないのは、
このような問題も一因だったと思われます。

[11] [[DTD]] など[[外部実体]]が [[HTTP URL]] で指定されている場合、
[[外部実体]]を取得する[[処理器]]でそのような[[文書]]を読み込むとその [[HTTP鯖]]へとアクセスが発生します。
[[キャッシュ]]や[[型録]]の仕組みがあるとはいえ、広く使われている[[外部実体]]には大量のアクセスが集中します。

[12] これは[[スケーラビリティー]]上の問題と指摘されている [SRC[>>9]]
のみならず、実際に [[HTML]] などの [[DTD]] がある [[W3C]] や [[RSS]]
の [[DTD]] があった [[Netscape]] の [[Webサイト]]には [[DDoS攻撃]]とも言えるほどのアクセスがあり、
苦慮しているようです。

[29] [[RSS]] の[[システム識別子]]の人も困っていました。


[REFS[
- [28] [CITE@ja[Androidアプリ開発者の環境から任意ファイルを取得可能な脆弱性「ParseDroid」 | スラド セキュリティ]]
([TIME[2017-12-09 14:33:34 +09:00]])
<https://security.srad.jp/story/17/12/08/202233/>
- [29] [CITE@en[W3C Systeam's blog - W3C's Excessive DTD Traffic]] ([TIME[2008-02-09 18:07:19 +09:00]] 版) <http://www.w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic>
]REFS]

* 事前条件符号 [CODE(XMLe)@en[no-external-entities]] (WebDAV)

[5] [CODE(URI)@en[[[DAV:]]]] [[名前空間]]の [DFN[[CODE(XMLe)@en[[[no-external-entities]]]]]]
[[要素]]は、[[外部実体]]が[[参照]]されていることを示す[[事前条件符号]]です。

[7] [[鯖]]が [[payload body]] に[[外部実体]]が含まれることを理由に[[要求]]を拒絶するなら、
[[状態符号]] [CODE(HTTP)[[[403]]]] と[[事前条件符号]]
[CODE(XMLe)@en[[[no-external-entities]]]] を使う[['''べきです''']] [SRC[>>6, >>9]]。

;; [10] [[WebDAV]] は[[外部実体]]は信頼出来ないもので注意するべき [SRC[>>9]]
としながらも、利用や対応を禁止まではしていないようです。

[8] この[[要素]]の[[内容]]は[[空]]です [SRC[>>6]]。

[REFS[
- [6] '''[CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#page-100>'''
- [9] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-20.6>
]REFS]

* メモ

[3] なんとなく、
[PRE[
<!ENTITY % ent SYSTEM "data:,%22EntityValue%22">
<!ENTITY entity %ent;>
]PRE]
みたいのはありかなあ? って気がしますが、 XML 仕様書にはダメとは書いてないので、いいんでしょう。
- [4] >>3 [[外部引数実体]>>1] へ。

[26] [CITE@en[ERB decision: External entities]]
([[Jon Bosak]]著, [TIME[1997-06-23 13:40:20 +09:00]])
<https://lists.w3.org/Archives/Public/w3c-sgml-wg/1997Jun/0460.html>

[27] [CITE@en[RFC 5323 - Web Distributed Authoring and Versioning (WebDAV) SEARCH]]
([TIME[2017-10-01 13:49:21 +09:00]])
<https://tools.ietf.org/html/rfc5323#section-7.1>

