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 を下記のように書き換えた。

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>

全部おkっぽい仕様(テスト用)

そして実行。

sudo ./flashpolicyd.pl --file=flashpolicy.xml

とりあえずこれで試してみたら、無事に socket 通信できた。
しかしめんどくさ(笑
まぁこれから弄くりたおしつつ理解を深めていこうかな。

追記 2008-05-09

Flashアプリは、843ポートにまず要求を送り、そこで返答がなければ、接続先ポートに要求を送る。さらにそこで返答がなければ、接続に失敗する。

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

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

関連エントリー:

Socket + AIR + ActionScript 3.0 + 2

Socket + AIR + ActionScript 3.0

Git + インストール

Snow Leopard + ruby + macports エラー

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt=""> <pre lang="" line="" escaped="" highlight="">