2008年03月12日

いってるそばから、Updateされるらしいです。

akihiro kamijo: 来月 (2008/4) の Flash Player セキュリティアップデート

確かに、昨年末には発表してたけど、予定日の発表おそすぎます。

夏くらいかなぁ?と余裕ぶっこいてました。

ま。不満を言ってても始まりませんので。

さて。

前回のエントリーしましたが、Socket用のcrossdomain.xmlは同一ドメインでもダメで、HTTP経由のcrossdomain.xmlでもダメになりますという話で、今回もそこを中心に補足したいと思います。

なお、通常の(Socket,XMLSocketクラス以外)crossdomain制約については従来通りと思いますので、ご心配なく。

ちょっとアレゲなことをしている人達が被害にあいます。

(他の変更点もあるので、安心しないでください。kamijoさんのブログ参照。)

かなり暴力的に説明すると、Flashが(ドメイン関係における)セキュリティにひっかかって動かないのは大きく2パターンで、外部ドメイン(領域)のデータ(バイナリ)にアクセスするような場合は、crossdomain.xmlが必要になり、もうひとつは、クロススクリプト(ロードしたswfのスクリプトをコールしたり、オブジェクトにアクセスするような行為)はallowDomain()を利用することになります。

クロススクリプトのほうが、Security.sandboxTypeなどの根が深いのでいろいろ面倒かもしれません。

問題のcrossdomain.xmlが必要になるようなケース、データにアクセスするような行為というのは、絶妙で、例えば画像やサウンドをロードするだけではポリシーに引っかからないのですが、いざピクセル操作や、drawとか、サウンドの場合はスペクトラムを見に行こうとすると、突然セキュリティエラーになるわけです。

逆に、テキストのロードや、バイナリを、URLLoader.load()しようとするとその時点でセキュリティエラーとなります。

おそらく現場では、

「うわー画像操作でエラーでたー」

「load()の引数の、LoaderContext設定しとくといいらしいぜ」

といった感じで単発解決しがちだと思いますが(少なくとも昔の私はそうであった)その法則はいろんなところで当てはまるというのを理解しておくと良いかもしれません。

(まぁ、これはcrossdomain.xmlの存在というよりは、必要になるのでメッソド実行の前にcrossdomai.xmlをチェックしておくようにという処理なのですが)

ロードするだけであれば、crossdomain.xml が必要されないメソッドは

Loader.load()~~Sound.load()~~NetStream.play()

らしいです。メソッドに依存するんですね。

詳しくは、Essential ActionScript の 19章にとてもよくまとめられています。(ホント、良い本です。日本語だったらもっとよかった。)

さて、大幅に脱線しましたが、Socketも同様にcrossdomain.xmlを必要として、上記のデータにアクセスする行為と一件して同じに見えるのですが、実装しようとすると大変な作業になります。

Adobeのサイトには、気軽にcrossdomain.xml置いてね。

とありますが、via HTTP の取得が不可能ということで、crossdomain.xmlを返すサーバを用意しろという話になります。

で、どんなプロトコルなのかドキュメントから引用すると

サーバーはポリシーファイルを送信するか、メイン接続を確立するかの決定の前に、クライアントからの最初の送信を待機する必要があります。Flash Player は、ポリシーファイルを要求する場合、接続が確立されると同時に、必ず次のストリングを送信します。~~ ~~

こんだけ。

これにポリシーファイルを返して接続を切れ。

という仕様しか書いてないと思います。Essential ActionScript にもそれしか書いてないし。

Adobe的には、それ以外のエラーはスクリプトで処理せよ。ということなのかな?

デフォルトのポートは843ということなので、Socket.connectを発動したときにFlashプレイヤーは、843へ自動的に問い合わせるのでしょう。

手動で問い合わせる方法は

Security.loadPolicyFile('xmlsocket://hoge:808');

となります。

あとは、Socket.connect をtryして、SecurityError を catch することで判断するしかないのかもしれません。

前回説明したとおり、1024番ポート以上でポリシーファイルを返した場合、Socketは1024番ポート以上にしかアクセスできないので注意してください。

crossdomain.xml内のallow-access-fromタグに、to-port属性もお忘れなきよう。

~~

 ~~

to-ports属性にアスタリスク(*)も指定できますが、1024番ルールは有効ですので注意してください。

私もいろいろ試してみようと思います。

試した方は、いろいろ教えてください。

追記

Flash Player が、policy file 取得に投げる

ですが、正確には最後にNullのバイトコード(00)が付きます。

それ以外のゴミはつきませんので、特殊な心配はいらないようです。

Socket.connect 時にデフォルトで、843ポートに問い合わせることも確認済みです。

エラーはSecurityErrorEventをハンドリングするしかないようです。

イベントオブジェクトを toString() で変換してから出力しても、種類は分類できそうにありません。

内容は以下の通りです。

[SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"]



(00:47)

この記事へのコメント

1. Posted by 筝 篋阪   2011年07月21日 18:53
篋阪祉筝≫罐純帥障鐚ф蚊篏篋阪祉<緇括紊緇<障羞篋阪祉坂泣若障

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔