* [CODE(XML)[access-control]] 処理指令 (XML) [2] [[XML]] [[文書]]で [DFN[[CODE(XML)[access-control]] [[処理指令]]]]を使うと、 外部からその[[文書]]の内容を処理しようとするのを認めるかどうか指定できます。 [3] 例えば、 [SAMP[example.net]] の[[文書]] [VAR[A]] は[[スクリプト]]で [SAMP[example.com]] の[[文書]] [VAR[B]] を読み込んで処理するように設計されているとします。しかし、 [[文書]] [VAR[A]] を読込む [[Webブラウザ]]は[[安全]]上の理由でこのような[[ドメイン]]を超えた操作を認めていないかもしれません。 そこで、 [CODE(XML)[access-control]] [[処理指令]]で [SAMP[example.net]] を認めると[[文書]] [VAR[B]] に記述すると、 [WEAK[([[Webブラウザ]]が対応していれば)]] [[文書]] [VAR[A]] の[[スクリプト]]は[[文書]] [VAR[B]] を処理できます。 [[#comment]] ** 仕様書 [1] [AC] [CITE[Authorizing Read Access to XML Content Using the Processing Instruction 1.0]] [[VoiceXML 2.1]] の附属書から分離されましたよ。 一応完成で改訂の予定無しだそうです。 [[RFC 2732]] 参照してるよ[AA[orz]] ([[名無しさん]] [WEAK[2005-06-13 23:12:28 +00:00]]) [[#comment]] ** 構文 [3] [SRC[AC 2]] :[CODE(infoprop)[[[対象]]]]:[CODE(XML)[access-control]] :[CODE(infoprop)[[[内容]]]]: - [CODE(ABNF)[[DFN[content]] := [(allow / deny / allow [[S]] deny) '''['''[[S]]''']'''] [SPAN(comment)[;; [1] ]]]] - [CODE(ABNF)[[DFN[allow]] := 'allow=' (<"> access-list <"> / "'" access-list "'") [SPAN(comment)[;; [1] ]]]] - [CODE(ABNF)[[DFN[deny]] := 'deny=' (<"> access-list <"> / "'" access-list "'") [SPAN(comment)[;; [1] ]]]] - [CODE(ABNF)[[DFN[access-list]] := access-item *([[S]] access-item) / "*" [SPAN(comment)[;; [2] ]]]] - [CODE(ABNF)[[DFN[access-item]] := host-name / partial-host-name / [[IPv4address]] / [[IPv6address]] [SPAN(comment)[;; [3] ]]]] - [CODE(ABNF)[[DFN[partial-host-name]] := "*." host-name [SPAN(comment)[;; [4] ]]]] [CODE(ABNF)[host-name]] は仕様 [SRC[AC 2]] によれば [[RFC 2732]] のものですが、 [[RFC 2732]] は [[RFC 2396]] を参照しています。 [CODE(ABNF)[[[IPv4address]]]] と [CODE(ABNF)[[[IPv6address]]]] も仕様 [SRC[AC 2]] によれば [[RFC 2732]] のものですが、 [[RFC 2373]] が参照されています。 [4] [CODE(XML)[access-control]] [[処理指令]]を記述する場所については特に規定がありません。 [[文書]]中のどこでもよいということでしょうか。 [5] [CODE(XML)[access-control]] [[処理指令]]は1つの[[文書]]中に何個でも記述できます [SRC[AC 2]]。 [[#comment]] ** 一致の判定 [6] [SRC[AC 2]] - [CODE(XML)[access-control]] [[処理指令]]がある場合、 -- 複数 [CODE(XML)[access-control]] [[処理指令]]があれば、 結合して考えます。 -= [[IP番地]]が [CODE(XML)[deny]] [[属性]]の値に一致すれば、 [[アクセス]]は拒否し、検索は終了します。 -= [[IP番地]]が [CODE(XML)[allow]] [[属性]]の値に一致すれば、 [[アクセス]]を認め、検索は終了します。 -= [[完全修飾ドメイン名]]が [CODE(XML)[deny]] [[属性]]の値に正確に一致すれば、[[アクセス]]は拒否し、検索は終了します。 -= [[完全修飾ドメイン名]]が [CODE(XML)[allow]] [[属性]]の値に正確に一致すれば、[[アクセス]]を認め、検索は終了します。 -= [[ドメイン名]]の[[ワイルドカード]]を使った最良一致を探します。 -=- [DFN[最良一致]]とは、[[ワイルドカード]]を使った一番近い一致です。 例えば、 [SAMP[bert.evil.example.com]] は [SAMP[*.example.com]] よりも [SAMP[*.evil.example.com]] に近いとします。 -=- 最良一致が [CODE(XML)[deny]] [[属性]]で見つかれば、 [[アクセス]]は拒否し、検索は終了します。 -=- 最良一致が [CODE(XML)[allow]] [[属性]]で見つかれば、 [[アクセス]]を認め、検索は終了します。 -= [[アクセス]]は拒否し、検索を終了します。 - [CODE(XML)[access-control]] [[処理指令]]が無い場合、 [[利用者エージェント]]の判断によります。 [8] >>5 の[[算法]]では、 [CODE(XML)[access-control]] [[処理指令]]が含まれる[[文書]]自体が置かれている場所が関与していないことに注意して下さい。 [SAMP[a.example.net]] に置かれている文書で [CODE(XML)[access-control]] する時で、 [SAMP[a.example.net]] の他の文書からの[[アクセス]]を認めたいなら、 [SAMP[a.example.net]] が認められるような指定も明記しなければなりません。 [[#comment]] ** 安全性 [12] [[利用者エージェント]]は安全への配慮から普通他のドメインにある[[文書]]を直接扱えないようにしています。 [CODE(XML)[access-control]] [[処理指令]]は便利さのためにこの制限を緩和しますが、 当然その分安全性は低くなります。 [13] [[利用者エージェント]]の安全の制限はドメイン名等によって[[利用者]]が制御できるようにされていることが少なくありませんが、 >>6 の算法をそのまま適用すると、 [CODE(XML)[access-control]] [[処理指令]]が存在する場合に[[利用者]]の意思を反映させられなくなります。 [[CSS]] の [CODE(CSS)[![[import]]]] のように [CODE(XML)[access-control]] よりも強い制御を[[利用者]]が指定できた方が便利かもしれません。 [14] 異なるドメインの文書の処理の制限は、 [WEAK[([[利用者]]にとっての)]] [[第三者]]に意図しないうちに情報が送られてしまうことを防ぐ意味もあります。 例えば [SAMP[example.net]] の[[文書]] [VAR[A]] から [SAMP[example.com]] の[[文書]] [VAR[B]] を [WEAK[([SAMP[example.com]] [[鯖]]側で処理される)]] [[引数]] [VAR[q]] をつけて呼び出すように記述されているとしますと、 [[利用者]]は気づかないうちに[[引数]] [VAR[q]] という情報を第三者に渡してしまうのです。 外部のドメインたる [SAMP[example.com]] の[[文書]] [VAR[B]] の取得の試み自体を安全制限違反で弾いてしまうのであれば、 [[引数]] [VAR[q]] が渡されることはありません。しかし [CODE(XML)[access-control]] [[処理指令]]を読むためには[[文書]] [VAR[B]] を読まなければなりませんから、その時点で[[引数]] [VAR[q]] が渡されてしまうのです。 [[#comment]] ** 例 [7] [[FQDN]] を2つ指定した例 [SRC[AC 2 改]] [PRE(XML example code)[ ]PRE] この例の場合、 [SAMP[voice.roadrunner.example]] や [SAMP[voice.acme.example]] は認められますが、 それ以外はすべて認められません。 [9] ワイルドカードを使った例 [SRC[AC 2]] [PRE(XML example code)[ ]PRE] [SAMP[voice.roadrunner.example]] や [SAMP[voice.acme.example]] はこの例でもやはり認められますが、 それだけではなく、 [SAMP[image.roadrunner.example]] や [SAMP[www.acme.example]] も認められます。 しかし [SAMP[acme.example]] は認められません。 [10] すべて認める例 [SRC[AC 2]] [PRE(XML example code)[ ]PRE] あらゆるホストが認められます。 [11] 一部だけ認めない例 [SRC[AC 2]] [PRE(XML example code)[ ]PRE] [SAMP[www.example.com]] は認められますが、 [SAMP[www.visitors.example.com]] は認められません。 なお、構文 >>3 により [CODE(XML)[deny]] [[属性]]は [CODE(XML)[allow]] [[属性]]の後に書かなければなりません。 算法 >>6 により、 [CODE(XML)[deny]] [[属性]]が [CODE(XML)[allow]] 属性より優先されます。 [[#comment]] ** メモ [[#comment]] * メモ