このクロスドメインActionScript 3エラーを修正するにはどうすればよいですか?
-
08-07-2019 - |
質問
できるだけ具体的かつ詳細になり、使用しているコードの一部を含めます。私はすでに検索を実行し、この質問を見つけました。同様;ただし、著者は3ではなくActionScript 2を使用していたため、自分の状況に対する回答を効果的に適用することができなかったようです。
同じドメインの制限を克服するために、Flash / ActionScript 3を介してJavaScriptのXMLHttpRequestオブジェクトの動作を(限られた方法で)エミュレートしようとしています。しかし、ActionScriptにはその点で独自の制限があることがわかりました。私は間違っているかもしれませんが、私が理解していることから、あなたがすべての権限を正しく持っている限り、ActionScriptを使用してこの種のクロスドメインスクリプティングを行うことは理論的にまだ可能です。そして、それが私が問題に直面しているところです。
まず、というクラスのオープンソースコードを借りました。 AjaxRequest 。これは /ajax/AjaxRequest.as
として保存しました。次に、 /jsajax.fla
というFlashファイルを作成し、最終的なSWFファイル /jsajax.swf
にエクスポートします。次に、Flashファイルの最初で唯一のフレームを構成するActionScriptコードを示します。
import ajax.AjaxRequest;
Security.allowDomain("domainone.com");
Security.allowDomain("domaintwo.com");
function jsAjax(stringURL:String, stringMethod:String, stringData:String):void
{
var xhr:AjaxRequest = new AjaxRequest(stringURL);
xhr.contentType = "application/x-www-form-urlencoded";
xhr.dataFormat = URLLoaderDataFormat.TEXT;
if ( stringMethod.toUpperCase() == "POST" ) {
xhr.method = URLRequestMethod.POST;
} else {
xhr.method = URLRequestMethod.GET;
}
xhr.addEventListener("complete", jsAjaxResponse);
xhr.send(stringData);
return;
}
function jsAjaxResponse(evt:Event):void
{
ExternalInterface.call("jsAjaxResponse", evt.currentTarget.data.toString());
return;
}
ExternalInterface.addCallback("jsAjax", jsAjax);
ExternalInterface.call("jsAjaxReady");
これまでのところとても良い。これらの Security.allowDomain
呼び出しの1つ以上は不要であると感じていますが、それらはこの問題を解決しようとする(失敗した)私の試みでした。
JavaScriptには、 jsAjax
、 jsAjaxResponse
、および jsAjaxReady
の3つの関数が定義されています。最後の1つは、非常に基本的な関数であり、Flashオブジェクトが正常にロードされたこと(ロード時に1回だけ呼び出されます)を示し、他の2つはデータの送受信に使用されます。ご覧のとおり、対応するActionScriptに対応しています。
最後に、このSWFファイルを埋め込む /test.html
という簡単なHTMLページを作成しました( swfobject )であり、 jsAjax
関数を呼び出すための簡単なフォームコントロールがいくつかあります。 JavaScript定義もすべてこのHTMLファイルに埋め込まれています。また、 $ _ REQUEST
配列の内容を出力する /test.php
という非常に単純なPHPスクリプトを作成しました。これが、このajaxメソッドを使用してリクエストするスクリプトです。
テストしたシナリオは3つありますが、動作させることができるのはそのうちの2つだけです。
シナリオ1:1台のサーバー上のすべて
これらのファイルをすべてdomainone.comにアップロードしてからtest.phpを要求すると、正常に機能します。ファイル/フォルダ構造は次のようになります:
domainone.com/jsajax.swf
domainone.com/test.html
domainone.com/test.php
繰り返しますが、これは動作します。 jsAjaxResponse関数はtest.phpからデータを正常に受信します。
シナリオ2:両方のサーバーで、左に傾いている
HTMLとSWFを最初のサーバーにアップロードし、2番目のサーバーでPHPスクリプトを呼び出すだけで、すぐには機能しませんでした。掘り下げてみましたが、domainone.comへのアクセスを許可する crossdomain.xml
ファイルをdomaintwo.comに作成することで修正されました。したがって、私のファイル/フォルダ構造は次のようになりました:
domainone.com/jsajax.swf
domainone.com/test.html
domaintwo.com/test.php
domaintwo.com/crossdomain.xml
crossone.xmlファイルでdomainone.comを明示的に許可する場合、これは機能します。繰り返しますが、jsAjaxResponse関数はtest.phpからデータを正常に受け取ります。
シナリオ3:両方のサーバーで右に傾いている
HTML以外のすべてをdomaintwo.comにアップロードすると、HTMLが機能しなくなりました。つまり、domainone.comのHTMLはdomaintwo.comでホストされているSWFファイルを参照しています。
解決
私はちょうどそれを理解しました! Flashファイルの Security.allowDomain
コマンドに関係していました。私は実際にdomainone.comのサブドメインで test.html
をホストしていましたが、それは捨てていました。完全一致、サブドメイン、およびすべてでなければなりません。 domaintwo.comを参照する Security.allowDomain
コマンドも、シナリオ3の crossdomain.xml
ファイルもまったく必要ないことがわかりました。 !
「本物」であるため、最終的に使用するこのスクリプトのバージョン、実際にdomainone.comが何であるかは必ずしもわかりません。Flashファイルの上部のコードを次のように変更しました。
import ajax.AjaxRequest;
try {
var domain1:String = LoaderInfo(this.root.loaderInfo).parameters["allow"];
if ( domain1.length > 0 ) {
Security.allowDomain(domain1);
}
} catch (error:Error) { }
try {
var domain2:String = LoaderInfo(this.root.loaderInfo).parameters["allowhttps"];
if ( domain2.length > 0 ) {
Security.allowInsecureDomain(domain2);
}
} catch (error:Error) { }
...
次に、最初にSWFを埋め込むために使用しているJavaScriptで、基本的に document.location.toString()
からページの現在のドメインを取得し、それがhttpまたはhttpsを使用し、flashvarsパラメーターで allow
および/または allowhttps
としてドメインを渡します。 「より良い」がありますこれを行う方法は、Flash Varsでドメインを明示的に設定することに依存せず(Flash内からの何らかの自動検出)、ActionScriptを十分に理解していないのでそれを理解することはできません。また、このファイルはすでにJavaScriptとActionScriptの間で双方向通信を行っているため、それほど大きな問題ではありません。このソリューションで十分です。