data: スキームと Location: ヘッダ

ふと気になって Location: ヘッダに data: スキームを指定した場合ブラウザがどういう挙動を示すのか試してみた。

慣れているので WEBrick で。

require 'webrick'
require 'uri'
s = WEBrick::HTTPServer.new(:Port => 8080)

class MyServlet < WEBrick::HTTPServlet::AbstractServlet
  def do_GET(req, res)
    res.status = 302;
    res['Location'] = 'data:text/html,' + URI.escape(%{<html><body><s>oops</s></body></html>})
    res.body = 'Okie-dokie!'
  end
end

s.mount("/", MyServlet)
trap("INT") { s.shutdown }
s.start

結果。IE 6, 7はもちろん未対応なのでいいとして、FireFox は完全スルーで何も起こらず。OperaSafari だけがスキームに指定されたコンテンツを解釈した。Javascript は両者ともにインラインのコンテキストで実行するようなので特にセキュリティ上の脅威になるわけではなさそうだけど、ちょっと気持ちが悪いのは事実。(Safarijavascript: スキームへのリダイレクトを明示的にエラーとする)