AS3 + Socket + セキュリティエラー
ActionScript3.0 の Socket を使用したアプリ作ってたらこんな問題にぶち当たったメモ。
Error #2044: ハンドルされていない SecurityErrorEvent : text=Error #2048: セキュリティサンドボックス侵害
Flex Builderのデバッガやローカルからの実行なら起こらないっぽい問題。
色々調べてみると
crossdomain.xml といったポリシーファイルを作成しなければいけないとのこと。
そして Socket 接続する前に Security. loadPolicyFile( "http://ドメイン/crossdomain.xml" ) を呼び出して、そのポリシーファイルを読み込まなければならない。
・・・との事だったのだが、せっせと置いて呼び出してもうんともすんとも言やしない。
これはどうしたものか・・・と悩みつつ調べていたら、どうやら最近セキュリティー系のアップデートがかかって Socket を使う場合、↑では駄目になったらしい。
今までの話はいったんなかったことにして
どうすれば良いのかというと。
1.Flashアプリが、843ポートに接続してくるのを待ち受ける。
2.<policy-file-request/> 文字列を投げてくるので、受け取る。
3.<policy-file-request/> 文字列を受け取ったら、ポリシーファイルを投げ返す。
以上。
そんな常駐アプリをつくればよい。
しかし、自分で作らなくても、なんとすでにAdobeの人が作成してくれている。
こちらに。
↑からダウンロードしてきたファイルの中で使ったものは、
Standalone/flashpolicyd.pl
flashpolicy.xml
の2個。
とりあえず flashpolicyd.pl を cp ../ して
flashpolicy.xml を下記のように書き換えた。
全部おkっぽい仕様(テスト用)
そして実行。
sudo ./flashpolicyd.pl --file=flashpolicy.xml
とりあえずこれで試してみたら、無事に socket 通信できた。
しかしめんどくさ(笑
まぁこれから弄くりたおしつつ理解を深めていこうかな。
追記 2008-05-09
Flashアプリは、843ポートにまず要求を送り、そこで返答がなければ、接続先ポートに要求を送る。さらにそこで返答がなければ、接続に失敗する。
要求を843ポートで受けたくない場合は、接続先ポートで要求を受けてポリシーファイルを返してやると、うまく行く。