プラグイン

プラグイン (Web)

[15] プラグイン (plugin) は、利用者エージェントが定義するところの利用者エージェントが利用する内容取り扱い器 (content handler) であって、 利用者エージェントDocumentレンダリングの一部となることができるものであり、 しかし Document子供閲覧文脈でも Node オブジェクトを作るものでもないようなものをいいます >>11

[16] 通常は第三者 (third party) に提供されるものですが、 利用者エージェントに組み込まれたものもあります >>11

[17] 例えば現在の多くの Webブラウザーは、組み込みの PDF プラグインを持っています。

[18] Webブラウザーから別途起動されるものはヘルパーアプリケーションと呼ばれ、 プラグインとは異なります。

仕様書

文脈

[10] プラグインは、次の場面で使われることがあります。

Web ブラウザーとプラグインの間の API

[19] HTML Standard ではWebブラウザープラグインの間の API は規定せず、利用者エージェントプラットフォームに依存するもの >>11 としています。

[20] プラグインに対応しないことも認められています >>11

[12]WebブラウザープラグインWebブラウザーとの間の API を用意しています。

[44] IEActiveX control に対応しています。 GeckoNPAPI に対応しています。 BlinkPPAPI に対応しています。 WebKitNPAPI に対応しています。

[13] プラグインは、 DOM 上の embed 要素object 要素を通じてスクリプトAPI を提供できます。

[14] かつては Javaアプレットスクリプトを相互接続する LiveConnect も使われていました。

[21] 著者スクリプトはそのような API の有無を通じて当該要素を処理するプラグインが有効か否かを判断できます。 また Navigator オブジェクトにも当該環境で有効なプラグインの情報を提供する API があります。

[30] object 要素プラグインは、フォームデータ集合に値を提供できます。

[58] プラグインWebブラウザーに対して、次のものを提供する必要があります。

名前
name 属性で使う値。
保安プラグインか否か
保安プラグインとできるかどうか。
隠れプラグイン
PluginArray に含まれ列挙可能か、 PluginArray に含まれるが列挙可能ではない隠れプラグイン (hidden plugin) >>67 か、 PluginArray に含まれないかのいずれか。
MIME型
ある MIME型の指定が当該プラグインで処理できるかどうかを判定します。 そのうちのいくつかは、 DOM に晒されます。晒されるものについては、 description 属性値suffixes 属性値も必要です。
拡張子
ある URLpath が当該プラグインで処理できるかどうかを判定する。
classid
ある classid が当該プラグインで処理できるかどうかを判定する。
version
version 属性値
description
description 属性値
filename
filename 属性値。 実際のファイル名である必要はありません。
実現値化
プラグイン実現値化する。Webブラウザーは、 fetch して得られた資源 (あれば) と引数の名前と値の組のリスト、 data 属性値 (object)、 保安プラグインとするかどうか、する場合は砂箱化の設定を引き渡す。失敗したら、エラーを報告する。

[64] プラグイン実現値は、Webブラウザーに対して、次のものを提供する必要があります。

読み込み完了
読み込み完了したら通知する。 (Webブラウザーload イベント発火します。)
レンダリング
Webブラウザーの指定した領域にレンダリングし、 適宜更新する。
イベント処理
鍵盤イベントマウスイベントなどの入力を処理する。
引数変化
object 要素引数の変化を受信したいプラグインは、 変化したとの通知を Webブラウザーから受け取ることができます >>23。 (属性の変化を受け取れるとは規定されていません。また、 param 要素の追加や削除を受け取れるとも規定されていません。)
フォームデータ集合における名前と値
object 要素で使うプラグインは、 フォームデータ集合構築時に名前と値を提供できます。
破棄
実現値を破棄する。
スクリプト可能インターフェイス
embed 要素object 要素実装する追加のインターフェイス (あれば) と legacycaller

[59] 加えて、実用上、 Webブラウザープラグインに対して、次のものを提供する必要があります。

fetch
Webブラウザーを介した fetch のための API
DOM
プラグインが使われている文書にアクセスする API
エラー
コンソールにエラーを報告するための API

[24] Webブラウザーは、利用可能なプラグインであっても、 Webブラウザーの判断により、または利用者の判断により、 無効とすることができます。

[61] 仕様書上この「無効」状態の扱いは一貫していません。 applet 要素の規定で Java プラグインが無効にできることを言及していたり、 object 要素で特定の object 要素についてプラグインを無効化できることを言及していたりしますが、 embed 要素でそのような規定はありません。 とはいえ、無効なものは「適切なプラグインが存在する」との条件を満たさないと解釈できますから、 仕様書と現実で矛盾しているわけではありません。

[105] プラグインの実装方法にもよりますが、 実際上、プラグインクラッシュすることも考慮しなければならない場合が多いです。

プラグインの選択

[69] embed 要素object 要素の処理では、それぞれでプラグインの選択方法が規定されています。

それぞれの項を参照。 applet 要素では、常に Java プラグインが選択されます。

[70] HTML Standard は具体的なプラグインWebブラウザーとのインターフェイスを規定していないこともあり、 大まなか選択方法の規定のみで、具体的な決定手順は決められていません。 プラグインは、 Webブラウザーに対して、 対応する MIME型URLpath のパターン (拡張子)、 classid を提示することが必要です。

[22] プラグインは、いくつかの MIME型について、それを処理できるものとして登録できます。 ただし、利用者エージェントtext/plainapplication/octet-stream についてプラグインが登録されたものとして扱ってはなりません >>11。 また仕様上明示的に禁止はされていませんが、 text/htmlapplication/xml のような DOM を構築する MIME型プラグインでの処理には不適切と思われます。

しかし歴史的理由で、 SVGプラグインで処理されてしまうことがあります。

[71] PluginArray 中のプラグインについて、 利用者エージェントは、その対応する MIME型のいくつかを明示的に対応 (explicitly supported) するものとして示さなければなりません >>67明示的に対応する MIME型は、 Plugin オブジェクトMimeTypeArray オブジェクトを通して晒されます。

[72] これは fingerprinting vector であり、利用者エージェント互換性プライバシーを両立させるべく適度に晒すことが期待されています >>67

[88] MIME型は元々データ形式を識別するためのものでしたが、 プラグインの識別にMIME型が使われたため、起動するべきプラグインを選択するためだけの目的で (データ形式なしに) MIME型が作られるようになりました。

[89] 例えば application/x-winamp-plugin のように名前に 「plugin」が入ったMIME型が多く存在します。

Web ブラウザーとスクリプトの間の API

[73] スクリプトは、 Navigator オブジェクト上の API を使ってプラグインに関する情報を得ることができます。次のインターフェイスがあります。

[74] しかしこれは fingerprinting vector であり、利用者プライバシーの保護のため、 できるだけ限定的な情報のみを提供することが Webブラウザーには求められています。 (各項を参照。)

[76] これらの情報は、大域オブジェクトの作成時、あるいは最初の参照時、 あるいは最初にプラグイン実現値を作成した時などの適当なタイミングのものと思われます。 (仕様上はいつの情報とするべきかは明確にされていません。元々プラグイン自体が相互運用性と相容れない存在ですから、この程度の差異は大した問題ではないのでしょう。) スクリプトrefresh メソッドにより最新の情報に更新することを求められます。

相互に参照可能な閲覧文脈同士でこれらの情報に (作成タイミングの差異により) 差異が生じることはあり得ます。

[75] プラグイン実現値スクリプトの間の API は、 各要素の項や LiveConnect を参照。

Plugin インターフェイス

[68] Plugin オブジェクトは、プラグインを表します >>67

[66] Plugin インターフェイスは、 次のメンバーを持ちます。

[78] Plugin オブジェクトが表すプラグインが、 最後の作成または refresh の時点で明示的に対応していた MIME型reported MIME type といいます。 >>67

[79] supported property indices は0から reported MIME type 数までのです >>67。 (実際には個数 - 1までです。) length 属性は、個数を返さなければなりません >>67item メソッドは、 unsigned long引数を1つ受け取る indexed getter です >>67引数で指定された位置の reported MIME type を表す MimeType があればそれを、 なければ null を返さなければなりません >>67。 ただし MimeType は、type 属性値整列しなければなりません >>67

[80] supported property namesreported MIME type を表す MimeTypetype 属性値です >>67。それに対応する named getter は、列挙不能でなければなりません >>67namedItem メソッドは、 DOMString引数を1つ受け取る named getter です >>67引数と同じ type 属性値MimeType があればそれを、 なければ null を返さなければなりません >>67。 ただし MimeType は、type 属性値整列しなければなりません >>67

[86] これらは、 MimeType インターフェイスenabledPlugin 属性の逆方向の参照です。

[81] name 属性は、プラグインの名前を返さなければなりません >>67。 これは普通は英語の短い文字列です。

名前が固有であることは特に要求されていませんが、 PluginArray での整列named getter に使われるため実用上固有であるべきです。 実際に Webブラウザーが固有であることを要求しているのかどうかは不明です。

[82] description 属性は、プラグイン定義の何らかの文字列を返さなければなりません >>67。 これは普通は英語のそう長くない文字列です。空文字列のこともあります。

[83] filename 属性は、プラグイン定義の何らかの文字列を返さなければなりません >>67

[84] pepflashplayer.dll のようなファイル名風の文字列や、 mhjfbmdgcfjbbpaeojofohoefgiehjai のような無作為風の文字列が使われます。

[85] HTML Standard は、これらは不必要に内部情報を曝け出すものであるとして、 descriptionname と同じ値、 filename空文字列とすることを強く推奨 (highly recommended) しています >>67

[87] Gecko は更に version 属性を提供しています。 ChromeHTML Standard にはありません。

[77] Plugin オブジェクトlive であってはなりません属性indexed getter/named getter で得られる情報は、 作成時と refresh 時を除き、変更してはなりません>>67 MimeType オブジェクトは、更新されない限り、 同じものが返されます。

プラグインの一覧

[32] 現在の多くのWebブラウザーは、 PDF プラグインを組み込みで実装しているようです。

[33] 現在の多くのデスクトップブラウザーは、 Flash プラグインがインストールされた状態になっています。

[47] それも徐々に使われなくなっています。またスマートフォンWebブラウザーにはインストールされていないのが普通です。

[34] かつては多くのWebブラウザーで次のプラグインがインストールされた状態でしたが、 現在はあまり使われなくなっています。

[46] JavaDirectorFlash に移行しました。 VRML は使われなくなりました。 RealPlayerQuickTimeWMP を使った動画像Flash に移行しました。
[45] かつてプラグインが必要だったものは、現在ではほぼすべて JavaScript で実現できます。

[31] NPAPI 等各種 API を使って実装されたプラグインの一覧は、 各 API の項を参照してください。

[35] >>9 には Chrome が使っているプラグインの一覧があります。

[40] Firefox は登録されたプラグイン以外は標準状態で有効にしない方針を採っています >>36, >>37, >>39

[60] embed 要素は常にプラグイン表現します。 適当なプラグインがなければ、既定プラグインが使われます。 また、エラーの発生時にも、その旨が代わりに表示されます。

相互運用性

[28] プラグインWeb の表現力を向上させるための拡張点として導入され、 90年代には活発に利用されていましたが、一方で相互運用性を低下させる問題ある機能でもありました。 00年代の JavaScript API の発展と HTML5 による HTML 自体の機能追加によりかつてプラグインを通じて提供していた機能のほとんどは Webブラウザー自体によって提供されるようになり、プラグインは役目を終えつつあります。

[29] ほとんどの Webブラウザーが対応している PDF を除き、著者プラグインに依存するべきではありません。 後方互換性のため Flash が利用できる環境も少なくありませんが、対応していない環境もあり、 著者Flash を可能な限り避けるべきです。それ以外のプラグインを使うのは、 不適切です。

セキュリティーとプライバシー

[25] Webブラウザーは、プラグインを使って外部の内容を処理する時には非常な注意を払う必要があります。特に第三者プラグインソフトウェアがWebブラウザーと同じ特権で動作する場合には、 第三者ソフトウェア脆弱性Webブラウザーにも波及します。 >>11

[26] 実際にプラグインバッファーオーバーフローその他の脆弱性Webブラウザーの安全性に深刻な影響を及ぼしたり、Web同一起源ポリシー等のセキュリティー上の制約がプラグインで遵守されず Webアプリケーションの安全性に問題が生じたりしたことがあります。プラグインの動作が不安定で異常終了するようなことがあれば、 Webブラウザー自体も巻き込まれてしまいます。最近の Webブラウザープラグインを別のプロセスで動作させたり、 第三者が提供するプラグインを排除したりしてこうした問題の除去に取り組んでいます。

[27] どのプラグインが利用できるか (その環境にインストールされているか) は歴史的に利用者によって異なっていましたから、これは finterprinting vector >>11 とされています。利用者エージェントはどの利用者に対しても同じプラグインの組み合わせのみに対応することが望ましい (encouraged) >>11 です。

[54] プラグイン自体やプラグインにより実行可能データが処理される場合には、 その安全性にも配慮が必要です。

[55] 例えば IEobject 要素で指定された ActiveX control を表示できますが、インストールされていなければ CAB ファイルをダウンロードして半自動でインストールできます。この時、 セキュリティーゾーンの設定にもよりますが、 証明書を表示して利用者の確認を求めるなどの手順があります。

[56] 近年の Webブラウザーは、プラグインの暴走を検出し、 強制終了させることができる場合があります。しかしWebブラウザープラグインの実装方法によっては、 一部または全部の暴走を停止させることができないかもしれません。

[91] プラグインは、Web におけるセキュリティーのための制約の抜け穴とならないことが期待されています。 例えば、同一起源ポリシーに違反するべきではありません。しかし、 Webブラウザーがそれを強制できるかどうかは、アーキテクチャによります。 多くの場合は、困難です。

[92] WebブラウザーCORS を実装する前から、 Flash などのプラグインは異なる起源へのアクセスを (限定的ながら) 提供していました。これは「機能」として提供していたものですが、 HTMLJavaScript で敢えて禁止していることを可能とするのはセキュリティーホールを開けるようなもので、 あまり好ましいとは言えないことだったと考えられます。

[90] プラグインは、砂箱化に対応していないものもあります。そうしたプラグインは、 砂箱下で使えないことになっています。砂箱化に対応すると主張するプラグインが実際に規制に従うかどうかは、 利用者にとってはプラグインの開発元を信用するしかありません。 利用者エージェントが規制に従うことを強制できるかどうかは、 アーキテクチャにも依存します。

[93] プラグインWebにおけるストレージの制約にも従うべきかもしれません。

利用者インターフェイス

[97] Webブラウザーは、利用者プラグインを管理する機能を提供するのが普通です。

[98] Webブラウザーによっては、登録されたプラグインを提供する Webサイトがあって、 そこからインストールできる (できた) かもしれません。

[101] Webブラウザーによっては、適当なプラグインが存在しない場合の既定プラグインから利用者の指示でプラグインインストールすることができるかもしれません。 その場合 embed 要素pluginspage 属性object 要素classid 属性プラグインのデータの MIME型などの情報が使われます。

[99] Webブラウザーによっては、動作中のプラグインの一覧を表示して、 利用者が必要に応じて強制終了させることができることがあります。

[100] Webブラウザーによっては、動作中のプラグインの状態を監視して、 クラッシュを検知して利用者に通知したり、動作しなくなったものを利用者が強制終了する選択肢を提示したりすることがあります。

歴史

[48] プラグインNPAPIembed 要素は、 Netscape Navigator 2 により導入されました。 Java appletapplet 要素も実装されました。

[50] applet 要素HotJava が実装していましたが、 それより前には app 要素でした。

[65] Plugin オブジェクトdescription, filename, length, nameIDL属性JavaScript 1.1 で追加されました。

[49] Internet Explorer 3 もこれらを実装しました。更に ActiveX controlobject 要素も実装しました。

[51] しかし IE はその後政治的理由で NPAPIJava への対応を取りやめることになります。

[52] 90年代には沢山のプラグインが作られ、多くの Webサイトで多くの embed 要素object 要素applet 要素が使われていました。しかし Webブラウザーによって異なる要素の異なる記述を使い分けなければならず、 またプラグインWindows のみや WindowsMac OS のみで提供されていることも多く、相互運用性には多くの問題を抱えていました。 プラグインを使ったページのほとんどすべては、 特定の Webブラウザーと特定のプラグインの特定の版が導入されていないと動作しない不便なページとなっていました。

[53] IETFW3C は、 SGML として不適切という理由で embed 要素の標準化を拒み、 特定の技術に依存しているという理由で applet 要素非推奨にすることで、 object 要素への統一を企てました。しかしプラグイン技術そのものを統一する動きにはなりませんでしたし、 この時代の object 要素は実質的に ActiveX control 専用でしたから、 embedapplet が使われなくなることはありませんでした。

[1] Inline Plug-ins (2007-02-28 00:41:17 +09:00 版) <http://web.archive.org/web/19970605061848/www82.netscape.com/comprod/products/navigator/version_2.0/plugins/index.html> (名無しさん)

[2] Gecko Plugin API Reference - MDC (2007-03-01 05:12:27 +09:00 版) <http://developer.mozilla.org/en/docs/Gecko_Plugin_API_Reference> (名無しさん)

[3] Web Kit Plug-In Programming Topics: Creating Plug-ins with Cocoa and the Web Kit (2007-03-09 08:50:03 +09:00 版) <http://developer.apple.com/documentation/InternetWeb/Conceptual/WebKit_PluginProgTopic/Tasks/WebKitPlugins.html> (名無しさん)

[4] プラグインを開発する環境を整える - shima111の日記 ( 版) <http://d.hatena.ne.jp/shima111/20080523/p1>

[5] Bug 8784 – politics in <param> example ( 版) <http://www.w3.org/Bugs/Public/show_bug.cgi?id=8784>

[6] Web Applications 1.0 r6573 Define how sandboxing works with plugins in a hypothetical world where plugins honour the sandbox. ( ( 版)) <http://html5.org/tools/web-apps-tracker?from=6572&to=6573>

[7] [whatwg] instantiating display:none plugins ( 版) <http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2011-November/033732.html>

[8] [whatwg] instantiating display:none plugins ( 版) <http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-June/036394.html>

[38] Keep your Firefox healthy with a quick checkup — Mozilla ( 版) <https://www.mozilla.org/en-US/plugincheck/>

[57] PluginDoc: Windows (MIME Type List) ( 版) <http://web.archive.org/web/20100911055400/http://plugindoc.mozdev.org/winmime.php>

[94] Plugins - Mozilla | MDN ( 版) <https://developer.mozilla.org/en-US/Add-ons/Plugins>

Plugins are now a legacy technology. They are not available on most mobile devices. Mozilla encourages website developers to avoid using plugins wherever possible.

[95] Pipelight - ArchWiki ( 版) <https://wiki.archlinux.org/index.php/Pipelight>

Pipelight is a special browser plugin which allows one to use Windows-only plugins inside Linux browsers. The main focus of the project is on Silverlight and its features, such as watching DRM protected videos. It works by creating a bridge between a Windows application, which handles the Windows-only plugin (e.g. Silverlight), and a native Linux browser plugin. The Windows application is run using a patched version of Wine, therefore requiring Pipelight users to move to this version. Pipelight can be used in browsers that support NPAPI plugins, such as Firefox. It does not work with Chromium.

[96] Add-ons that cause stability or security issues are put on a blocklist | Firefox Help ( 版) <https://support.mozilla.org/en-US/kb/add-ons-cause-issues-are-on-blocklist>

[102] Remove the storage mutex due to lack of implementation · whatwg/html@1b918cf ( 版) <https://github.com/whatwg/html/commit/1b918cf72fcbba011f83b92ab5d1f483fb1cafa3>

[103] Plugin Activation in Firefox | Future Releases ( 版) <https://blog.mozilla.org/futurereleases/2013/09/24/plugin-activation-in-firefox/>

[104] dev-tech-plugins Info Page ( 版) <https://lists.mozilla.org/listinfo/dev-tech-plugins>

[106] Safari: About Internet plug-in management - Apple Support ( ()) <https://support.apple.com/en-us/HT202819>

[107] web browser - Can web sites detect whether you are using private browsing mode? - Information Security Stack Exchange () <http://security.stackexchange.com/questions/9037/can-web-sites-detect-whether-you-are-using-private-browsing-mode>

Similarly, Adobe's DRM system (used by HBOGO, apparently) surfaces an error code when the browser is InPrivate/Incognito, because required "license artifacts" are not permitted to be created in the private mode. https://forums.adobe.com/thread/1189199

[108] IE11とFirefoxのAdobe PDFで意図しない情報漏洩の可能性 | スラド セキュリティ () <https://security.srad.jp/story/16/11/16/147247/>

問題の脆弱性は、PDFにプログラムを埋め込める「FormCalc」という機能に関連するもの。FormCalcにはネットワーク経由でコンテンツの取得や送信を行える「Get」や「Post」、「Put」といった命令が用意されている。これを利用してPDFが配信されているドメインと同じドメイン上のデータを取得し、それを外部サーバーに送信するという処理をPDFを閲覧するマシン上で自動実行させることができるという。

一般的なWebブラウザでは、スクリプトによるHTTPリクエストについて、リクエスト先をそのスクリプトを配信するドメインに限定する、「同一オリジンポリシー(same-origin policy)」が適用されている(Mozillaによるドキュメント)。しかし、FormCalcではこの制限が緩く、取得した情報を別のサイトに送信できてしまうという。

[109] 615738 - Deprecate chrome://plugins - chromium - Monorail () <https://bugs.chromium.org/p/chromium/issues/detail?id=615738>

[110] Can't access chrome://plugins/ in Google Chrome 57. - Google プロダクト フォーラム () <https://productforums.google.com/forum/#!msg/chrome/1NGbts8-IFo/zFylS8HCBQAJ>

[111] [038776]HTML文書にプラグインを貼り付ける[ドキュメントナビ] () <http://support.justsystems.com/faq/1032/app/servlet/qadoc?QID=038776>

[112] Clarify steps when embed tag has unhandled MIME type · Issue #3876 · whatwg/html () <https://github.com/whatwg/html/issues/3876>