OperaのWidgetからlocalhostにアクセスできない件

JQuery(じゃなくてもいいけど)を使って以下のようにアクセス。

$.ajax(
    {
      type : "GET"
    , url : "http://127.0.0.1:10080/"
    , data: "foo=1&bar=2"
    , async : false
    , dataType : "html"
    , success : function( data, status ) {
        log( data, status );
      }
    }
);

すると、以下のようなエラーが返ってきた。

JavaScript - file://localhost/C:/widget/hogehoge/index.html
Event thread: DOMContentLoaded
Error:
name: Error
message: Security violation

これを見て、Opera的にはlocalhostも立派なローカルストレージの一部であり、プライベートな領域だからアクセスできないようにしていると思った。

という旨をTwitterで愚痴ったところ、edvakfさんからOpera Widgets security model – Opera Developer Communityのページを紹介して頂いた(というかページの存在に今まで気づかなかったのもどうかと思うが)。このページの中に以下のような記述が。

The following IPv4 IP ranges are defined as intranets:

  • 10.0.0.0 to 10.255.255.255
  • 172.16.0.0 to 172.31.255.255
  • 192.168.0.0 to 192.168.255.255
  • 169.254.0.0 to 169.254.255.255

Opera Widgetが接続を許可しているイントラのIPアドレスの範囲だが、自分のPC=localhostは127.0.0.1なので許可されていない。

やはりセキュリティ的にアクセスさせない方向だったか・・・いや、むしろサーバーのほうを変えてみるというのはどうだ?

WebrickのServerを以下のように設定して起動させてみる。

server = WEBrick::HTTPServer.new( {
    :Port => 10080,
    :BindAddress => '192.168.0.***'
} )

BindAddressにはプライベートアドレスを。でもってWidget側でアクセスしてみたところ、見事に反応が返ってきた。

ただ、これってセキュリティ的にどうなのよ? と思ったら、しっかり書いてあった。

A special limitation is that widgets may only contact either internet addresses or intranet addresses, not both kinds.

つまり、Widgetはインターネットかイントラネットのどちらかにしか接続できませんよ、と。実際に試したところ、http://www.yahoo.co.jp/%E3%81%AB%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92%E5%87%BA%E3%81%97%E3%81%9FWidget%E3%81%A7%E3%81%AF%E3%80%81%E3%83%AA%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%82%88%E3%81%86%E3%81%8C%E4%BD%95%E3%81%97%E3%82%88%E3%81%86%E3%81%8C%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AB%E3%81%AF%E4%B8%80%E5%88%87%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E3%80%82%E9%80%86%E3%82%82%E3%81%97%E3%81%8B%E3%82%8A%E3%81%A7%E3%80%81%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7%E6%9C%89%E5%8A%B9%E3%81%AA%E8%A8%AD%E5%AE%9A%E3%81%A8%E3%81%97%E3%81%A6%E6%AE%8B%E3%82%8B%E3%82%88%E3%81%86%E3%81%A0%E3%80%82

これなら、例えプライベートアドレス+ポートを総当りで恥ずかしいデータを抜かれても外に持ち出せない、ということなのだな。

いちいちサーバーにスクリプトをアップロードせずともローカルだけでテストできるようにしたかったので、テスト用途ならこの仕様で満足だわ。