セキュリティの 超 基 礎
もくじ ( )のセキュリティ 概 要 サンドボックス 間 のアクセス クロスドメインポリシーファイル クロススクリプト のセキュリティ 概 要 サンドボックス ベースのセキュリティ ベースのセキュリティ
のセキュリティ 概 要 ファイルは 異 なるドメインのアセット( 画 像 や 音 声 ファイル) のデータ(ビットマップやサウンドデータ )にアクセスできない ドメインが 異 なれば セキュリティサンドボックスが 異 なるから 異 なるドメインのアセットを 読 み 込 んで コンテンツとして 表 示 するだけであれば アクセスできる セキュリティサンドボックスとは? ドメイン 単 位 で 設 定 されるセキュリティグループ アセットを 読 み 込 んだ 時 に そのアセットが 属 するドメイン 毎 に 設 定 される www.example1.com のサンドボックス www.example2.com のサンドボックス A.swf a.jpgの データ B.swf b.jpgの データ
サンドボックス 間 のアクセス クロスドメインポリシーファイルでの 許 可 が 必 要 リモートサンドボックス www.example1.com のサンドボックス www.example2.com のサンドボックス a.jpgの データ リモート リモート b.jpgの データ FlashPlayer10から FileReference.browse()で ファイルの 保 存 読 込 ができるようになったが プログラムでファイルを 指 定 することはできない ファイル local-with-filesystem サンドボックス(デフォルト) サンドボックス local-with-networking サンドボックス (use-network フラグをコンパイラで 設 定 ) local-trusted サンドボックス (システム 管 理 者 ユーザが 設 定 ) *Security.sandboxType プロパティでサンドボックスを 確 認 できる
クロスドメインポリシーファイル サーバーのデータを どのドメインの ファイルが 利 用 できるかを 示 す ファイル <?xml version="1.0"?> <cross-domain-policy> <site-control permitted-cross-domain-policies="メタポリシー 設 定 "/> <allow-access-from domain= www.example.com" /> </cross-domain-policy> デフォルトでは ポリシーファイルの 名 前 は にし ファイルはサーバーのルートディレクトリに 置 く(マスターポリシーファイル) サーバー 全 体 に 適 用 メタポリシー 設 定 :ポリシーファイルの 管 理 する 設 定 で マスターにのみ 記 述 可 能 ファイルは メソッドを 使 って 以 外 の 名 前 や ルート 以 外 の 別 ディレクトリのポリシー ファイルをロードできる このポリシーファイルは 任 意 のディレクトリとそのサブディレクトリにのみ 適 用 される
クロススクリプト 2つの ファイルが 一 方 の の 変 数 やメソッドの 変 更 実 行 を 行 うこと オブジェクトなどを 使 用 異 なるドメインの ファイル 同 士 のクロススクリプトは 基 本 不 可 一 方 で を 呼 び 出 すことで 異 なるドメイン 間 での( 一 方 からの)クロススクリプトの 許 可 ができる その 許 可 は 一 方 通 行 www.example1.com www.example2.com A.swf B.swf var url:string = http://www.example2.com/b.swf: var req:urlrequest = new URLRequest(url); myloader.load(req); myloader.content.cnt = 5; myloader.content.testfun(); //A.swfにアクセス 許 可 を 与 える Security.allowDomain( www.example1.com ) ; var cnt:number; Function testfunc() { }
のセキュリティ 概 要 セキュリティの 進 化 系 アプリケーションサンドボックス: インストーラファイルに 含 まれる 全 てのファイル つまり アプリケーションディレクトリ( )にあるファイル アプリ 実 行 時 にアプリケーションディレクトリツリー 内 の 全 てのファイルがアプリ ケーションサンドボックスに 割 り 当 てられる 非 アプリケーションサンドボックス: ネットワークやインターネット アプリケーションディレクトリ 以 外 から 読 み 込 んだ 全 てのファイルが 割 り 当 てられる ネットワークやインターネットから:リモートサンドボックス アプリケーションディレクトリ 以 外 からのから: または
サンドボックス 間 のアクセス アプリケーションサンドボックス アプリケーションディレクトリツリー 内 のすべてのファイルが 割 り 当 てられる AIR APIが 使 用 可 能 を 含 むどのドメインからも 自 由 にデータを 読 み 込 める App:/ App:/.jpg App:/ HTML 動 的 にコード 実 行 させるAPI( 例 え ばEval 関 数 )の 使 用 制 限 あり AIR JavaScript APIは 使 用 可 能 非 appからappの アクセス 不 可 AIR API Eval() 動 的 なコード 関 数 は 実 使 行 用 APIは 可 能 使 用 可 能 AIR JavaScript APIは 使 用 不 可 非 appはair APIは 使 用 不 可 リモート リモート.jpg リモート HTML HTML ファイル remoto local-with-filesystem local-with-networking local-trusted 非 アプリケーションサンドボックス アプリケーションサンドボックスに 読 み 込 まれるコンテンツ 以 外 が 配 置 される *AIR JavaScript API (AIRAliases.js ファイルを 使 用 するときに window.runtime プロパティまたは air オブジェクトを 通 じて 使 用 できる API)
ベースのセキュリティ(1) 非 アプリケーションサンドボックスの から を 使 うには を 使 う: 同 クライアント 上 で 実 行 中 のファイル 間 であれば 複 数 の ファイル 間 の 通 信 ができる App:main.swf //LocalConnectionのインスタンス 作 成 var con:localconnection = new LocalConnection(); // 接 続 を 許 可 するドメイン/アプリケーションIDを 指 定 con.allowdomain( ドメイン 名 ); //データを 受 け 取 るメソッドを 持 つインスタンスを //clientプロパティに 指 定 con.client = this; // 接 続 名 を 指 定 してconnectメソッドを 呼 び 出 す con.connect( 接 続 名 ); public function savetextfile( 引 数 ):void{ //AIR APIを 使 った 処 理 } App-storage:sub.swf //LocalConnectionのインスタンス 作 成 var con:localconnection = new LocalConnection(); // LocalConnection.send()メソッドに 渡 す 接 続 名 var connectionname:string = app#アプリケーションid. 発 行 者 ID: 接 続 名 ; // ボタンを 押 すと 通 信 する function onclicksavebtn(event:mouseevent):void{ con.send(connectionname, savetextfile, 引 数 ); } *アプリケーションID: app.xmlのid 属 性 NativeApplication.nativeApplication.applicationIDでも 確 認 可 能 * 発 行 者 ID: インストールディレクトリ META-INF AIRのpublisheridに 書 いてあるID NativeApplication.nativeApplication.publisherIDでも 確 認 可 能 (ADL 実 行 時 は 不 要 )
ベースのセキュリティ(2) を 使 う: 異 なるドメイン サンドボックスの ファイル 間 の 通 信 ができる App:main.swf var loader:loader = new Loader(); var urlreq:urlrequest = new URLRequest( app-storage:/sub.swf ); var localinfo:loaderinfo = loader.contentloaderinfo; //SaveTextFileToDesktopクラスをparentSandboxBridgeに 設 定 localinfo.parentsandboxbridge = this; loader.load(urlreq); public function savetextfile( 引 数 ):void{ //AIR APIを 使 った 処 理 } *システムAPIや 重 要 なアプリケーションAPIは SandboxBridgeを 介 してダイレクトに 公 開 しない App-storage:sub.swf //SaveTextFileToDesktopクラスを 共 有 var testobj:object = loaderinfo.parentsandboxbridge; //ファイル 保 存 処 理 を 呼 び 出 す testobj.savetextfile( 引 数 );
ベースのセキュリティ(3) を 使 って を 読 込 んだ 場 合 まで: 読 込 んだ はアプリケーションサンドボックスに 配 置 から: 読 込 んだ は 非 アプリケーションサンドボックスに 配 置 ( 設 定 で と 同 じ 振 る 舞 いが 可 能 非 推 奨 ) var html:htmlloader = new HTMLLoader(); var htmlstr:string = "<html><body>hello <b>world</b>.</body></html>"; html.loadstring(htmlstr);
ベースのセキュリティ(1) 非 アプリケーションサンドボックスの から を 使 うには アプリケーションサンドボックスの にインラインフレームを 用 意 フレーム 内 に (リモートサンドボックス)を 読 み 込 む エレメントに 属 性 と 属 性 を 追 加 : フレームコンテンツを 配 置 するサンドボックスとドメインを 決 定 する : フレームコンテンツの 読 み 込 み 元 の 親 フレームと 子 フレーム 間 のブリッジ( )の 設 定 プロパティ: 親 フレーム 内 から 子 フレームのオブジェクト 関 数 にアクセス 可 能 プロパティ: 子 フレーム 内 から 親 フレームのオブジェクト 関 数 にアクセス 可 能 ( 親 フレームで を 使 用 する 関 数 を 設 定 すれば 子 フレームから 呼 び 出 せる) Test.air App.html <iframe src= remote.html sandboxroot=http://www.test.com/ documentroot="app:/test/"> SandboxBridge http://www.test.com/ remote.html
ベースのセキュリティ(2) App:main.html <script type="text/javascript > //sub.htmlのメソッドの 呼 び 出 し var childinterface = document.getelementbyid("child").contentwindow.childsandboxbridge; air.trace(childinterface.testchildfunc()); // abc </script> <iframe //sub.htmlに 公 開 するメソッド var parentinterface = {}; parentinterface.testparentfunc = function(text){ //AIR APIを 使 った 処 理 } document.getelementbyid("child").contentwindow.parentsandboxbridge = parentinterface ; Id = child src=http://www.test.com/sub.html sandboxroot=http://www.test.com/ documentroot="app:/main/"> </iframe> http://www.test.com/sub.html <script type="text/javascript > //main.htmlに 公 開 するメソッド var childinterface = {}; childinterface.testchildfunc = function(){ return abc"; } window.childsandboxbridge = childinterface ; </script> //main.htmlのメソッド 呼 び 出 し var testtxt = ABC"; window.parentsandboxbridge.testparentfunc(texttxt);