ping

a 要素、area 要素 ping 属性 (HTML)

[67] ping 属性は、リンクをたどる際に同時にアクセスするべき URL を指定するものです。

仕様書

文脈

[74] 著者JavaScript その他の方法で ping 属性を使わずとも同じことが実現できるわけですが、 ping 属性を使えば何を行うか (どこがリンク先で、 どこに ping を行うか) 利用者利用者エージェントに対して明確にでき、 利用者エージェントが処理タイミングを調整するなどして利用者の体験を向上させることが期待できます。 従って、著者は他の方法ではなく ping を使うべき (encourage) です >>50

[75] 例えば検索エンジンは、直接リンク先サイトにリンクせず、 一旦自社サイトにリンクして、そこからリダイレクトすることで、 どのサイトが選択されたかを集計することができます。

[76] これを ping による集計に切り替えることで、 ping へのアクセスは Webブラウザーが裏で行うこととなるので、 利用者リダイレクト分の余計な時間をかけずに目的サイトに移動できます。 (利用者の体験が向上するのは、検索エンジンにとっても好ましいことです。)

[77] また、利用者は正しいリンク先URLステータスバーで確認できます。

[78] 加えて、利用者が潔癖なら Webブラウザーの設定を変更して ping 属性を無効化することで、 集計を拒否できます。 (検索エンジンにとっては改善のためのデータを収集する機会が失われるので嬉しくはありませんが、 それを快く思わない人から無理に収集するのもまた意に反するでしょう。 リダイレクトその他独自の方法では、利用者にその選択肢を与えることも困難です。)

利用者の設定

[63] 利用者エージェントは、利用者ping 属性の挙動を調節できるようにするべきです >>50

[65] 例えば、 Referer: ヘッダーの送信有無と同時に設定可能とすることができます >>50

[66] ping 属性をすべて無視しても構いませんし、 第三者 URL を無視するなどの判断を挟んでも構いません。 >>50

処理

[51] ping 属性の処理は、 要素要素とリンク先の対象URLについて、 次のようにしなければなりません >>50

  1. [52] を、要素ping 属性値に設定します。
  2. [53] null なら、ここで停止します。
  3. [54] リストを、文字列を間隔で分割を適用した結果に設定します。
  4. [55] リストの各要素字句について、
    1. [56] URL を、要素節点文書相対字句構文解析した結果に設定します。
    2. [57]
      ... のすべてを満たす場合、
      1. [61] 要求fetch します。
        要求
        URL
        URL
        メソッド
        POST
        ヘッダーリスト
        Ping-From
        要素節点文書起源URL起源同じ起源か、 要素節点文書HTTPS状態none なら、 要素節点文書URL。それ以外なら、 null
        Ping-To
        対象URL
        本体
        PING
        クライアント
        要素節点文書関連する設定群オブジェクト
        終点
        空文字列
        credentialsモード
        include
        参照元
        no-referrer
        URL credentials利用
        process response
        1. [64]fetchabort して構いません。

[62] fetch の結果は使われません。 fetch並列に行うことができます >>50。結果が使われない以上、どう実装されているか著者が直接感知することはできません。

[42] ping 属性の処理は、ハイパーリンクをたどる処理から呼び出されます。

[43] 趣旨からするとダウンロード時にも ping が送信されるべきと思われますが、 なぜかそうなっていません。 (ハイパーリンクをたどることにより navigate が発生し、それがダウンロードに至った場合には、最初のたどった時点で ping が送信されます。)

実装がどうしているのかは不明。

[69] Ping-From: ヘッダーは、 https: のページの場合、同一起源でなければ送信されません。つまり同一起源ポリシーが適用されます。 http: の場合は、異なる起源であっても送信されます。 Referer: ヘッダーの動作 (参照元ポリシー no-referrer-when-downgrade) に倣ったものと思われますが、 同一起源でなければならない分、少し厳しくなっています。

[70] そもそも pingURL著者が指定するもので、 著者は任意の URL を指定でき、 URL に自ページの URL を含めることもできるわけですから、この制約は情報の漏洩を防ぐものではありません。 XHRFetch を使って Ping-From: の指定された要求を送信することはできますから、 第三者の不正なスクリプトからの送信を防げるものでもありません。 この制約が何のためのものなのかは不明です。

[71] >>70 CORS preflight でOKが出ないと POST + Ping-From: は送れないのか。それなら、 HTTPS を使っていれば、不正な要求と区別できる。

[72] >>14 で削除された仕様書のコメントによると元々 Referer: を含めないことにしていたのは他の POST と区別できるようにするためらしい。 既存のサーバーCSRF などの検査を壊さないように Referer: とは別にほぼ同じ意味の Ping-From: を設定することにしたようである。更に付け加えると、 pingCORS より古いので、 Ping-From: が他の方法で指定されて異なる起源に送信される、 ということは想定されていない模様。

[73] >>20 あたりも参照。

関連

[37] 似た機能に Beacon があります。

[68] WebSocketPingフレームHTTP/2PING フレームとは無関係です。

実装

[80] ChromeOperaSafari実装しています。

[81] Firefox にも実装は一応されていますが、標準設定では無効になっています。

[82] IEEdge は未実装です。

[83] FirefoxEdgeBeacon には対応しています。

歴史

誕生

[15] 2005年10月に Web Applications 1.0 に追加されました。

[1] Mozilla Links 日本語版: Firefox のプライバシー問題 http://mozlinks-jp.blogspot.com/2006/01/firefox_21.html

あれだ、やっぱりpingタグなのかよw (名無しさん 2006-01-22 01:27:04 +00:00)

[2] Bug 319368 - Implement <a ping> https://bugzilla.mozilla.org/show_bug.cgi?id=319368 (名無しさん 2006-01-27 01:03:54 +00:00)

[3] 本当の問題は安全性よりも (賛成派の主張の通り、少なくても今より危険になるわけではない)、POSTされることではないか。 もちろんHTTPREST的にはPOSTの方が適当なのだが、 tag soup application開発者はしばしば (formではなく) aPOSTすることを望んでいる (あちこちの掲示板で頻出の質問)pingがそれに濫用される可能性がないだろうか。

ただしpingに対する応答レンダリングされないので、彼らの需要を満たせるのかどうかには疑問もあるが。

pingを使ってPOSTして、側でセッション管理 (もちろんREST制約違反)、hrefセッション情報 (Cookie) でGETして結果を得る、ただしpinghrefのどちらが先に処理されるかはわからないのでRefreshでもして待つ、 などという裏技が紹介される日が来る・・・かもしれない。 もはや何をしたかったのかよくわからないがw

(名無しさん 2006-01-27 08:07:12 +00:00)

HTML5 からの除外

[16] 2010年3月には、実装状況がよくないため、 W3C HTML5 から除外されました。 (最新版 HTML には残されました。)

[23] HTML5 Revision Tracker Move ping='' to the next version of HTML (and out of the W3C HTML5 draft) ( 版) http://html5.org/tools/web-apps-tracker?from=4823&to=4824

WebKit による実装

[24] IRC logs: freenode / #whatwg / 20100823 ( ( 版)) http://krijnhoetmer.nl/irc-logs/whatwg/20100823#l-350

[25] Ilya Grigorik - Google+ - Google mobile search is getting faster - to be exact,… ( ( 版)) https://plus.google.com/+IlyaGrigorik/posts/fPJNzUf76Nx

[26] 401217 – Issues with support for "ping" attribute ( ( 版)) https://bugzilla.mozilla.org/show_bug.cgi?id=401217

[27] [webkit-dev] <a ping> landed ( ( 版)) https://lists.webkit.org/pipermail/webkit-dev/2010-October/014657.html

[28] [webkit-dev] <a ping> landed ( ( 版)) https://lists.webkit.org/pipermail/webkit-dev/2010-October/014575.html

[29] Issue 21589 - chromium - Implement <a ping> - An open-source project to help move the web forward. - Google Project Hosting ( ( 版)) https://code.google.com/p/chromium/issues/detail?id=21589

[30] Bug 50488 – Enable <a ping> for Mac/Windows/WebKit2 builds ( ( 版)) https://bugs.webkit.org/show_bug.cgi?id=50488

[31] Issue 257281 - chromium - <a ping> does not issue a ping request when "Open Link in New Tab" - An open-source project to help move the web forward. - Google Project Hosting ( ( 版)) https://code.google.com/p/chromium/issues/detail?id=257281

[32] 951104 – Enable <a ping> by default ( ( 版)) https://bugzilla.mozilla.org/show_bug.cgi?id=951104

[33] IRC logs: freenode / #whatwg / 20131219 ( ( 版)) http://krijnhoetmer.nl/irc-logs/whatwg/20131219

[34] Web Applications 1.0 r8369 Make a.ping and area.ping use DOMSettableTokenList based on #whatwg feedback. Hopefully no content relies on their existing implementations; if they do let me know and we'll back this out. ( ( 版)) http://html5.org/tools/web-apps-tracker?from=8368&to=8369

[35] Bug 24238 – Should the tokens in HTMLAnchorElement.ping be resolved? ( ( 版)) https://www.w3.org/Bugs/Public/show_bug.cgi?id=24238

[36] Add ping context · 2c01edc · whatwg/fetch ( ( 版)) https://github.com/whatwg/fetch/commit/2c01edca7a910f333b8ffac9d51d872f0b58e895

[4] Due to [PutForwards] the ping IDL attribute needs be readonly · whatwg/html@29578b4 ( 版) https://github.com/whatwg/html/commit/29578b4cb3f79aaaa3401b5f7e800867edba0ee8

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

[6] Chrome が実装しており、標準で有効になっています。 Firefox は標準で無効にしています。

[7] IDL属性 pingChromeFirefox も実装しています。 (Firefox は標準で ping 属性を無効にしていますが、 IDL属性は存在します。)

[8] IDL属性 pingChromeFirefoxDOMTokenList ではなく DOMString としています。

[9] Intent to Implement: Replace DOMString with DOMSettableTokenList for {HTMLAnchorElement, HTMLAreaElement}.ping. - Google グループ ( 版) https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/Z-RBeFLHRSU

[10] Issue 498219 - chromium - Replace DOMString with DOMSettableTokenList for {HTMLAnchorElement, HTMLAreaElement}.ping. - An open-source project to help move the web forward. - Google Project Hosting ( 版) https://code.google.com/p/chromium/issues/detail?id=498219

[11] Handling of url parsing errors in a.ping is undefined · Issue #477 · whatwg/html ( 版) https://github.com/whatwg/html/issues/477

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

[13] Adding [SameObject] to DOMTokenLists · whatwg/html@ec1dc4d ( 版) https://github.com/whatwg/html/commit/ec1dc4d4571c61cf0c0dfe3e562898635886b412

[14] Never send a referrer with hyperlink auditing pings · whatwg/html@faec3a5 ( 版) https://github.com/whatwg/html/commit/faec3a50ea181f322ab9819975e285ced34a0308

[40] Use the HTTPS state concept instead of "encrypted connection" · whatwg/html@1ee3316 ( 版) https://github.com/whatwg/html/commit/1ee3316caa1a5754f7bbd29c494842785f9a181b

[44] Fix #1089: don't send pings for non-http(s) URLs · whatwg/html@817da95 ( 版) https://github.com/whatwg/html/commit/817da9577b565e808d7af0295e1affc094887418

[45] Bug 156801 – Anchor element 'ping' property should only apply to http/https destinations ( 版) https://bugs.webkit.org/show_bug.cgi?id=156801

[46] Make a.ping and tableCell.headers strings, not DOMTokenLists ( (domenic著, )) https://github.com/whatwg/html/commit/7dd2e95b03edd19515c636152d63d3c74cb69d6f

[47] Make area.ping a string, not DOMTokenList ( (zcorpan著, )) https://github.com/whatwg/html/commit/da9e4cb7142277d609e6636a56a282f5aba15e5c

[48] Use URL's HTTP(S) scheme concept and define rel=icon better ( (annevk著, )) https://github.com/whatwg/html/commit/a932f7dfd5e50101db47a373cee27b04ed108934

[79] Align Fetch's destination concept with changes in Fetch (sideshowbarker著, ) https://github.com/whatwg/html/commit/5e8f96a85d182d36c177db0d6fdde58b4ded86d4