download=""

ダウンロード (Web)

[18] ダウンロード (download) は、 クライアントがサーバーから受信する操作をいいます。 多くの場合、クライアント側のファイルシステム等のデータベースに保存する操作までを含めてダウンロードといいます。

[19] 受信したデータをその場で表示したり、ストリーミング再生したりする操作もネットワークからのデータ受信のみに着目すればダウンロードですが、 利用者が意図的にファイルとして保存しないため、 利用者の視点ではダウンロードではありません。

仕様書

プロトコル

[20] HTTP や FTP がファイル転送に使われます。

[21] 次のようなプロトコル要素やアルゴリズムがあります。

保存

[13] 多くの Webブラウザーは、 navigate 時のダウンロードの他に、 表示中の文書の保存や、画像、媒体等の保存の機能を提供しています。

[14] 文書の保存は、元の HTML の保存だけでなく、表示中の文書の直列化や、 表示中の文書とそれに埋め込まれている画像や CSS 等の一式の保存、 平文化して保存といった機能が提供されていることがあります。

[15] 「Web ページ、完全」で保存すると、 Chrome と Firefox の場合は拡張子以外のファイル名 + _files、 IE の場合は拡張子以外のファイル名 + .files という名前のフォルダーが作られ、その中に画像等のファイルが保存されます。

[16] Windows のエクスプローラーは本体ファイルを削除するとこのフォルダーも同時に削除します。

[17] IE は MHT 形式での保存にも対応しています。この形式では画像等もまとめて1つのファイルになります。

ダウンロード

[39] fetch の結果の応答をダウンロードとして (as a download) 処理するとは、 起源と提案ファイル名やイベントについて、 次のようにするべきです >>40。

  1. [41] 応答が失敗なら、
    1. [42] 利用者に問題を報告します。
  2. [43] それ以外なら、
    1. [44] 利用者に対して、応答を保存する手段を提供します。

[45] 一般的なWebブラウザーは、 fetch 開始直後、または応答ヘッダー受信時点で、 利用者にファイル名を尋ねるダイアログを表示します。 あるいは実装と設定によっては、ダイアログなしでダウンロード用のディレクトリーに自動的に保存します。

[46] 利用者エージェントは、ファイル名が必要な場合、 次のように決定するべきです。 この手順は信頼できないサイトからのダウンロードの危険性を緩和しようとするものですから、 利用者エージェントはこれに従うことが強く推奨 (strongly urged) されています。 >>40

  1. [47] ファイル名を、 null に設定します。
  2. [68] CD を、応答のヘッダーリストに Content-Disposition ヘッダーに設定します。
  3. [69] CD が null でなければ、
    1. [67] 配置型を CD の配置型に設定します。
    2. [60] HTTPファイル名を、 CD の filename の値に設定します。
  4. [70] それ以外なら、
    1. [71] 配置型を、 null に設定します。
    2. [72] HTTPファイル名を、 null に設定します。
  5. [48] 配置型が attachment で、 HTTPファイル名が null でなければ、
    1. [49] ファイル名を、HTTPファイル名に設定します。
  6. [50] それ以外なら、
    1. [55] 起源が null なら、
      1. [56] 信頼された操作を、真に設定します。
    2. [57] それ以外なら、
      1. [52] 応答のURLのschemeが data なら、
        かつリダイレクト以外の場合?
        1. [53] 資源の起源を、起源に設定します。
      2. [54] それ以外なら、
        1. [51] 資源の起源を、応答のURLの起源に設定します。
      3. [58] 信頼された操作を、 起源と資源の起源が同じ起源かどうかに設定します。
    3. [59] 信頼された操作が真で、HTTPファイル名が null でなければ、
      1. [61] ファイル名を、HTTPファイル名に設定します。
    4. [62] それ以外なら、
      1. [64] 信頼された操作が真か、配置型が attachment なら、
        1. [73] ファイル名を、提案ファイル名に設定します。
      2. [63] ファイル名が null なら、
        1. [65] 信頼された操作が真か、イベントが利用者のダウンロードの指示があったことを示していれば、
          1. [66] ファイル名を、応答のURLから利用者エージェント依存の方法で決定した値に設定します。
        2. [74] それ以外なら、
          1. [75] 利用者エージェント依存の方法で、利用者を保護するための手段を講じます。 著者が異なる起源の資源を利用者にダウンロードさせようとしていますが、 著者に悪意があって利用者を騙そうとしている場合もあります。 ここで停止して構いません。
          2. [76] ファイル名を、利用者エージェント依存の方法で決定した値に設定します。 (利用者に決めさせたものでも構いません。)
  7. [78] 利用者にダイアログを表示するなどして、 ファイル名を編集させて構いません。
  8. [79] ファイルシステムの制約に合わせて、ファイル名を調整します。
  9. [80] プラットフォームが拡張子を使ってファイルの種別を判断するなら、
    1. [81] 資源の型を、 応答の Content-Typeメタデータに設定します。
    2. [82] 名前の型を、ファイル名の拡張子から判断した型に設定します。
    3. [83] 資源の型と名前の型が同じか、 名前の型が利用者の意図に沿うもの (例えばファイル名の一部として利用者が明示的に指定したもの) かのどちらでもないなら、
      1. [84] 資源の型の拡張子がわかるなら、
        1. [85] ファイル名を変更して、資源の型の拡張子とします。
      2. [86] それ以外で、名前の型が危険なもの (実行可能ファイル、シェルスクリプトなど) なら、
        1. [87] ファイル名に安全とわかっている拡張子 (.txt など) を付加して構いません。
  10. [88] ファイル名を返します。

[89] 保存先の決定には、著者側から提供された情報 (HTTPファイル名や提案ファイル名や応答のURL) を使うべきではありません >>40。

[77] ダウンロードの処理は、 ハイパーリンクのダウンロードにより、またはnavigateにより、 呼び出されます。

[90] Webブラウザーによっては、利用者を保護するため、 ダウンロードしたのがウイルスその他危険なファイルでないかを検査します。 Safe Browsing を使う実装もあります。

[92] 保存の具体的な動作は、プラットフォームやWebブラウザーの制約や実装方針によって異なります。 例えば、次のように動作する実装があります。

[95] ダウンロードの進行中は、 ダウンロードマネージャーその他の Webブラウザーの UI によって、そのことや進捗が利用者に提示されるのが一般的です。

[96] ダウンロードの進行中に、利用者がダウンロードを中断、すなわち fetch を abort できるのが普通です。

[97] 利用者の指示により、またはネットワーク状況その他の理由により fetch が中断されエラー終了した場合は、ダウンロード全体もまたエラー終了として扱う必要があります。 Webブラウザー依存の方法により、失敗であることやその状況を利用者に報告したり、 必要に応じて一時ファイルを削除したりする必要があります。

[101] 応答の Last-Modified: ヘッダーで日時が設定されていれば、 これをファイルの日時として使うべきと考えられます。設定されていないときや、 ファイルシステムの日時表現の範囲外の場合、 利用者の設定により特に望まれたときなどは、現在時刻に設定するべきと考えられます。

[102] ファイルシステムが認める日時の範囲内である限り、 ファイルの日時が原因でセキュリティー問題になることは中々考えにくいですが、 慎重を期すなら、現在時刻から何十年も前の日時や数年以上先の日時なら、 不正な指定として無視するべきとの考えもあるかもしれません。

[104] プラットフォームによっては、 インターネットから入手した信頼できないファイルを表す属性がファイルシステムに存在することがあり、 Webブラウザーも適切に設定することが期待されています。 例えば Windows (NTFS) では ZoneId を設定することが期待されます。

ヘルパーアプリケーション

[37] navigate、ヘルパーアプリケーションも参照。

a 要素 download 属性

[29] a 要素の download 属性は、当該ハイパーリンクがダウンロードのためのものであることを示します。

属性値

[30] 本属性を指定しないと、ダウンロードではなく、 通常のハイパーリンクをたどる操作が想定される既定の動作であることを表します。

[31] 本属性を指定すると、当該ハイパーリンクが資源のダウンロードのために使われることを著者が意図していることを表します >>28。

[32] 本属性に値を指定すると、ダウンロードした資源を手元のファイルシステムに保存する際に名札として使うべきファイル名の既定値として著者が推奨する値を表します >>28。

[33] 値には、制約はありません >>28。 しかしファイルシステムやプラットフォームの制約、 あるいは利用者の指示によってファイル名は適宜修正されるものですから、 著者が指定した値がそのまま使われるわけではありません。 拡張子の有無なども特に規定されていません。 (プラットフォームに依存するので、利用者エージェントが利用者を適当に誘導するべき事項でしょう。)

[38] ダウンロードして保存する先のディレクトリー (フォルダー) を指定する方法はありません。 ディレクトリーの指定があっても、利用者エージェントは無視するべきとされています。

処理

[34] ハイパーリンクのダウンロードを参照。

[35] 本属性は、ハイパーリンクの既定の動作を指定するものです。 利用者や利用者エージェントにダウンロードを強制するものではありません。 文脈メニューなどを通して利用者が直接指示した場合は、 ダウンロードせずにハイパーリンクをたどることとなるかもしれません。

別ドメインからのダウンロード

[124] Webブラウザーは同じ起源でない (cross-origin) リンクの download 属性を完全に無視し、通常の navigate を実行します。 >>121, >>122, >>134

[125] ただし、 data: URL へのリンクはダウンロードになります。

[126] 他のドメインにあるファイルをダウンロードさせたいときは、 ファイルの応答ヘッダーで Content-Disposition: attachment を指定しなければなりません。


[127] この挙動は本来の仕様に違反していますが、 セキュリティーのためとされ >>123, >>122、 仕様の変更が提案されています >>121。

法令との関係

[112] 本項のダウンロードは、 Web における技術用語としてのダウンロードです。 これは各国の著作権等の法令や契約等におけるダウンロードと必ずしも同じ意味ではありません。

歴史

[36] download 属性は、需要を反映して、 HTML5 で追加されました。

[1] HTML5 Tracker ( 版) http://html5.org/tools/web-apps-tracker?from=6317&to=6318

[2] [whatwg] Forcing a download ( ( 版)) http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-July/032601.html

[3] [whatwg] <a download> feedback ( ( 版)) http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-February/034880.html

[4] [whatwg] <a download> feedback ( 版) http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-June/036320.html

[5] WWW-Talk Jan-Mar 1993: binary file access via Mosaic ( ( 版)) http://1997.webhistory.org/www.lists/www-talk.1993q1/0258.html

[6] 676619 – Implement proposed download attribute ( ( 版)) https://bugzilla.mozilla.org/show_bug.cgi?id=676619

[7] Web Applications 1.0 r7836 Fix <area> to match <a> in terms of security checking. Also, some editorial fixes. ( ( 版)) http://html5.org/tools/web-apps-tracker?from=7835&to=7836

[8] [whatwg] Priority between <a download> and content-disposition ( ( 版)) http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-August/040445.html

[9] Add download context per https://www.w3.org/Bugs/Public/show_bug.cgi?id=... · 69dfdc3 · whatwg/fetch ( ( 版)) https://github.com/whatwg/fetch/commit/69dfdc385ff40d48c06fede66b28a6aedbc848b0

[10] 1030660 – Is ClearBogusContentEncodingIfNeeded() needed? ( 版) https://bugzilla.mozilla.org/show_bug.cgi?id=1030660

Note that specifically for the save-to-file behavior what we actually do is completely ignore the Content-Type when deciding whether to decode. We just compare the URI filename extension, if any, to the Content-Encoding. If the Content-Encoding matches the filename extension, we don't undo the content encoding; otherwise we undo it.

[11] 184971 – display MIME type of the server in download dialog and not the mime-type returned by windows registry ( 版) https://bugzilla.mozilla.org/show_bug.cgi?id=184971

実装

[12] 最近の Webブラウザーには、ダウンロードしたファイルのセキュリティー検査を自動的に行うものもあります。

[22] Web Security Context: User Interface Guidelines ( 版) http://www.w3.org/TR/wsc-ui/#robustness-software-install

Web user agents MUST NOT expose programming interfaces which permit installation of software without a user intervention.

User agents MUST inform the user and request consent when the user agent is attempting to install software outside of the agent environment as a result of web content. The interaction used MUST follow the requirements in 6.4.2 Warning/Caution Messages . User agents SHOULD NOT provide features which can be used by web content to install software outside of the agent environment without the user's consent.

[23] Integrate Fetch into HTML · whatwg/html@7c5555a ( 版) https://github.com/whatwg/html/commit/7c5555a16f2920c02244c10756bb2f1a11e87a22

[24] MIME Type Detection in Windows Internet Explorer (Windows) ( 版) https://msdn.microsoft.com/en-us/library/ms775147(v=vs.85).aspx

[25] Clarify the following/downloading hyperlink algorithms · whatwg/html@47e4aa0 ( 版) https://github.com/whatwg/html/commit/47e4aa05825df966848ca2c7773794576a130b88

[26] IE9以降でダウンロード時file.exeがfile_exeにリネームされる件対処 - Qiita ( 版) https://qiita.com/tukiyo3/items/dfcecb145a101addd2a1

「暗号化されたページをディスクに保存しない」のチェックを外す。

OS再起動

[27] URLs are parsed and produce records · whatwg/html@30bc255 ( 版) https://github.com/whatwg/html/commit/30bc2557105ad62881ec9670f253febbc9761b44

[91] Issue 610284 - chromium - Regression: 'Download as PDF' option is not working on 'www.chromium.org/Home'. - Monorail ( ()) https://bugs.chromium.org/p/chromium/issues/detail?id=610284

[98] Linking: borrow HTML attributes, explicitly allow nested links, cleanup ( (AmeliaBR著, )) https://github.com/w3c/svgwg/commit/33f85d2bdd20e7d33eedff77b85b10c8451db397

[99] Allow <a>/<area> with download="" to not require user activation (domenic著, ) https://github.com/whatwg/html/commit/5de03c7b38e7b33a49f0dcf2bcef29e8eb9a2205

[100] Revert part of "Allow <a>/<area> with download="" to not require user… (zcorpan著, ) https://github.com/whatwg/html/commit/b359209579d79a713af88ecf24b9be8fb6168adf

[103] New Web Features in Safari 10.1 | WebKit () https://webkit.org/blog/7477/new-web-features-in-safari-10-1/

[105] WindowsのSCFファイルをGoogle Chromeでダウンロードさせ、SMB認証情報を取得する攻撃 | スラド IT () https://it.srad.jp/story/17/05/20/224211/

[106] 159292 - During download, "file.lnk" is renamed "file.download", name is _not_ fixed upon completion. - chromium - Monorail ( ()) https://bugs.chromium.org/p/chromium/issues/detail?id=159292

[107] 346744 - Security: download attribute allows download without user interaction - chromium - Monorail ( ()) https://bugs.chromium.org/p/chromium/issues/detail?id=346744

[108] 570210 - "Save link as" takes suggested filename from @download without checking origin. - chromium - Monorail ( ()) https://bugs.chromium.org/p/chromium/issues/detail?id=570210

[109] 373182 - Wrong file name when clicking on data-uri anchor with "download" tag - chromium - Monorail ( ()) https://bugs.chromium.org/p/chromium/issues/detail?id=373182

[110] How to name videos in <source>? (missing spec) · Issue #2964 · whatwg/html () https://github.com/whatwg/html/issues/2964

[111] 744499 - Consider downloading `ftp://` resources rather than rendering them. - chromium - Monorail () https://bugs.chromium.org/p/chromium/issues/detail?id=744499

[113] Deprecations and removals in Chrome 65  |  Web  |  Google Developers () https://developers.google.com/web/updates/2018/02/chrome-65-deprecations

[114] CORB: protecting certain nosniff and 206 responses (anforowicz著, ) https://github.com/whatwg/fetch/commit/794dd5452705564538440cc5b2c1f13d909e2f9a

[115] Allow Range header to be set by APIs (jakearchibald著, ) https://github.com/whatwg/fetch/commit/819d8c9d6617986a831ecd9cf21c34ba9589a890

[116] Correct the short definition for a/download values (AmeliaBR著, ) https://github.com/w3c/svgwg/commit/d1fffddbf1896910bbb5a5d2acf0dd896c06dd09

[117] Update SVGAElement to match attributes on HTMLAnchorElement by dstorey · Pull Request #409 · w3c/svgwg () https://github.com/w3c/svgwg/pull/409

[118] 非常に長い名前のBlobでFirefoxをクラッシュさせる攻撃 | スラド セキュリティ () https://security.srad.jp/story/18/09/27/085207/

[119] 多くの環境の "%USERPROFILE%\Downloads" が魔窟・ゴミ屋敷な現状を理解すべき (#3212395) | 「UNLHA32.DLL」が7年ぶりにアップデート | スラド () https://srad.jp/comment/3212395

[120] 1030660 - Is ClearBogusContentEncodingIfNeeded() needed? () https://bugzilla.mozilla.org/show_bug.cgi?id=1030660

[121] Confusion on how to handle cross-origin download attribute · Issue #2562 · whatwg/html () https://github.com/whatwg/html/issues/2562

[122] 714373 - Ignore <a download> for cross origin URLs - An open-source project to help move the web forward. - Monorail () https://bugs.chromium.org/p/chromium/issues/detail?id=714373

[123] Block cross-origin <a download> - Chrome Platform Status () https://www.chromestatus.com/feature/4969697975992320

[128] 最近の Chrome はファイルをダウンロードしろと指示出してるのに素のHTTPだと警告だしてダウンロードしてくれない、警告に対して再度指示しないとダウンロードしてくれないようになったのが本当にうざい。

[129] 100歩譲って HTTPS から素のHTTPにリンクされてるダウンロードが警告されるのはまあいいでしょう。実際危険な行為なんだから。 でも素のHTTPから素のHTTPにリンクされてるダウンロードを差し止めるのは意味不明じゃないですか。 素のHTTPのウェブページを開いた時点でリスクはもうあって、そのリスクを織り込んで表示して、そこからダウンロードしろといってんの。危険なことなんてわかっててやれっていってんの。

[130] 素のHTTPからの data: URL のダウンロードも警告でるんよね。まあ理屈はわかるんだけど。。。 でも誰も得していない。

[131] 何がよろしくないって、セキュリティーを錦の御旗にして大して実害がない機能までぶっ壊して後方互換性というウェブの重要な価値を毀損してることよね。 これに限らず Chrome チームがやっていることにそういうのが多くて、世論の Google への不信感を増幅させてるし、なにより HTTPS化というウェブ界の安全のための共通目標に対する嫌悪感を生んでいるのが罪深い。