as a download

ダウンロード (Web)

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

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

仕様書

プロトコル

[20] HTTPFTPファイル転送に使われます。

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

保存

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

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

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

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

[17] IEMHT 形式での保存にも対応しています。この形式では画像等もまとめて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] CDnull でなければ、
    1. [67] 配置型CD配置型に設定します。
    2. [60] HTTPファイル名を、 CDfilename の値に設定します。
  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] 応答URLschemedata なら、
        かつリダイレクト以外の場合?
        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] ダウンロードの進行中に、利用者ダウンロードを中断、すなわち fetchabort できるのが普通です。

[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化というウェブ界の安全のための共通目標に対する嫌悪感を生んでいるのが罪深い。