- 2009/12/01 20:19
- セキュリティサンドボックス
あ、ハックして画像をロードしたい、とかじゃなくて、そもそもの概念がよくわかっていなかったので、
自分なりに少し粘着質に調べてみた結果、少し理解が進んだ気がしたので、ここにシッカリ記録しておきます。
僕の貧弱な知識とテスト力ですので、間違いがあったら指摘ください。お願いしますー。
概要 (鬱陶しい例え話をするぜ)
まずは、事の始まりであるエラー文を読みます。
Error #2044: ハンドルされていない SecurityErrorEvent : text=Error #2048: セキュリティサンドボックス侵害 : http://localhost/flash_RandD/RD_01/bin-debug/index.swf は http://myTestServer.net/uploadTest/img/Image085.jpg からデータを読み込めません。
見出しっぽいのが2つあります。
- ハンドルされていない SecurityErrorEvent
- セキュリティサンドボックス侵害
1は、エラーイベントにリスナが立てられてないですよ、と言ってるんだと思います。
問題は2です。
なんなのよ、セキュリティサンドボックス侵害って…
そこで、色々とテストをしてみた結果、僕の中の結論はこうです。
例えます。
セキュリティサンドボックス = 国境
crossdomain.xml = 友好国がリストアップされた立て看板
で、最初のエラー内容を例えなおすと、
localhost 共和国の index.swf は、myTestServer.net 王国に入国しようとしましたが、友好国の立て看板に
自分の国がリストされてないにも関わらずなんかしようとしたので、国境の侵害と見なされました。なので、エラーイベント(警鐘)を国境で鳴らしましたが、その警鐘は、ただ鳴っただけでした・・・
つまり、このエラーを出ないようにするためには、
友好国が書かれた立て看板に、localhost 共和国の名を入れて貰い、入国を認めてもらったらいいんです。

国はどこで、立て看板の在処はどこか、に気をつける
さて、ここからが僕がハマってた問題。
結論から書きます。
ローカルPCは、国ではない。
なんか、「CDは株券ではない/菊地成孔」みたいですけど。
ローカルPCは国(サーバー)ではないんで、index.swf は立て看板があっても入っていいかどうか判らないので、
とりあえず侵入してしまいます。 強気なローカルswf さん。漢(オトコ)だねぇ。
これは、FileReferenceインスタンスを使って、ローカルPCからファイルをアップロード・ダウンロードする際にも適用されます。

なので、ローカルPCのswfファイルを実行してる限り、あるサーバー(国)からのファイル(資産)のダウンロードは、
URI(資産の在り処)さえ分かれば可能となりますし、ローカルPCのファイルのアップロードも、アップロード場所さえ
特定できて、書き込み可な状態であれば、書き込めます。
なので、制作中にファイルをローカルPCから実行してるだけだと、いざファイルを本環境にアップした時にビビります。
怖いですねー。
「サーバー上のswfを見ている」という事は、どういう事なのか
これも地味に勘違いしてたのです。恥ずかしながら。
今回の作業で、画像アップロードがあるので、色々とネットで調べていた時に参考にさせて頂いたのが、コチラ。
記事のまとめ項目4にある、クロスドメインポリシーファイル必須 を、なにも深く考えずに信じていたのですが、
色々テストしてると、どうも僕の案件ではcrossdomain.xmlがなくても機能していた(upload()できていた)のです。
「あれー?」と思ったんですけど、よくよく考えたら判りました。
swf が置いてあるドメインと、upload()するドメインが一緒だからだった・・・
当たり前ですよねー。ねー。
サーバー上の swf は、ローカルPCに一旦コピーされて実行されてるわけですが、
それでも元々の出身国はサーバー上なわけですよ。 ここを忘れてた。
同じ国土内にアップロードするんだから、立て看板もクソもないわけです。
feb19 さんの注意書きは、ドメインを超えてupload()する時は、相手ドメイン内にcrossdomain.xmlが必須ですよー、って事でした・・・orz
ありがとうございました。
付随する情報を、諸々。
調べてる最中に色々と判った事を、メモメモ。
1. swf には、立て看板の置き場所をあらかじめ教えておかないといけない
Security.loadPolicyFile()で、crossdomain.xmlまでのパスを教えてあげる必要があります。
教えなかった場合、swf はドメイン・ルート(国境の一番外っかわ的なとこ)にcrossdomain.xmlがあると予想して見に行きます。
立て看板がなかった場合、「自分の国は、この国にとって友好国ではない」と判断します。
なので、ダウンロードだの、相手国内にある画像をBitmap.drawが許可されません。
(写し絵もダメなんですねー)
あと、教えた立て看板の場所より上層ディレクトリに、別の立て看板があったとしても、
あくまで教えた立て看板だけを入国の判断材料にするようです。
散々擬人化しておいてなんなんですが、swf は結局はただのファイルなんで、ディレクトリを潜っていく道程で
ファイルを見るだとか、そういう事はできないんですねー。
2. swf に色々とお使いさせなければ、立て看板の制約を逃れられる
色々あるAPIサービスの中には、crossdomain.xmlでサブドメイン系(関連国)しか許可してないパターンがあります。
(ex: twitter API )
http://twitter.com/crossdomain.xmlを叩いて、
ソースを表示させると、allow-access-from domainタグの属性が、全てサブドメインですねー。
こういう時は、完全に別国に所属している swf 自身に情報を持ってきてもらおうと色々load()系のメソッドをやっても、
軒並み弾かれます。
なので、swf じゃなく、立て看板を読みに行かないようなヤツにやってもらう必要がある、と。
そのうちの1つの方法が、コチラ。
swf には自国内のphpを叩かせ、その叩かれたphpが変わりに、twitter国の情報を持ってくる、という感じですかね。。。
phpにはクロスドメインという機構は存在しない、って事なんでしょうか(未調査)
あー、鬱陶しい例えだった・・・
そんなこんなの、とても鬱陶しい例えに始終してしまいましたが、これくらい噛み砕いておいたら
自分も忘れないかな、と思っての、記録でした。
なにか「技術的に違うぞ!」 という事があれば、コメントお願いします。
「例え方が下手クソすぎる!」という突っ込みも受け付けますが、枕を濡らしてしまうのでやめてください。
コメント:0
トラックバック:0
- この記事のトラックバック URL
- http://djakarta-trap.net/blog/2009/12/securitysandbox_01/trackback/
- トラックバックの送信元リスト
- セキュリティーサンドボックスを克服したい件。 - djakarta-trap より