読者です 読者をやめる 読者になる 読者になる

AS3 + Socket + セキュリティエラー

ActionScript3.0

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ポートで受けたくない場合は、接続先ポートで要求を受けてポリシーファイルを返してやると、うまく行く。

参考[猫とか2 Flash ソケットポリシーへの対応]