デフォルトでは、ランタイムはポート 843 から提供されるソケットポリシーファイルを検索します。URL ポリシーファイルと同様に、このファイルは
マスターポリシーファイル
と呼ばれます。
ポリシーファイルが最初に Flash Player 6 に導入されたとき、ソケットポリシーファイルのサポートはありませんでした。 ソケットサーバーへの接続は、ソケットサーバーと同じホストのポート 80 上にある HTTP サーバーのデフォルトの場所に置かれているポリシーファイルによって承認されていました。Flash Player 9 では、この機能が引き続きサポートされていますが、Flash Player 10 ではサポートされていません。Flash Player 10 では、ソケットポリシーファイルだけがソケット接続を承認できます。
URL ポリシーファイルと同様に、ソケットポリシーファイルは、ポリシーファイルを提供するポートを指定するメタポリシーステートメントをサポートします。しかし、ソケットポリシーファイルのデフォルトメタポリシーは、「マスターのみ」ではなく「すべて」です。したがって、マスターポリシーファイルで高度な制限が設定されている場合を除き、Flash Player では、ホスト上の任意のソケットがソケットポリシーファイルを提供できるものと見なされます。
接続先のソケットが SWF ファイルと同じドメインにある場合でも、ソケットへのアクセスおよび XML ソケット接続は、デフォルトで無効です。次の場所のいずれかからソケットポリシーファイルを提供して、ソケットレベルのアクセスを許可できます。
-
ポート 843(マスターポリシーファイルの場所)
-
メインソケット接続と同じポート
-
メインソケット接続以外のポート
デフォルトでは、Flash Player はポート 843 およびメインソケット接続と同じポートでソケットポリシーファイルを検索します。別のポートからソケットポリシーファイルを提供する場合、SWF ファイルは、
Security.loadPolicyFile()
を呼び出す必要があります。
ソケットポリシーファイルのシンタックスは URL ポリシーファイルと同じですが、アクセスを許可するポートも指定する必要がある点が異なります。ソケットポリシーファイルが 1024 未満のポート番号から提供される場合、任意のポートへのアクセスが許可されます。ポリシーファイルがポート 1024 以上のポートから提供される場合、1024 以上のポートへのアクセスのみが許可されます。許可するポートは、
<allow-access-from>
タグの
to-ports
属性で指定します。指定できる値は、単一のポート番号、ポート範囲、およびワイルドカードです。
次に、ソケットポリシーファイルの例を示します。
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<!-- Policy file for xmlsocket://socks.mysite.com -->
<cross-domain-policy>
<allow-access-from domain="*" to-ports="507" />
<allow-access-from domain="*.example.com" to-ports="507,516" />
<allow-access-from domain="*.example.org" to-ports="516-523" />
<allow-access-from domain="adobe.com" to-ports="507,516-523" />
<allow-access-from domain="192.0.34.166" to-ports="*" />
</cross-domain-policy>
ポート 843 またはメインソケット接続と同じポートからソケットポリシーファイルを取得するには、
Socket.connect()
または
XMLSocket.connect()
メソッドを呼び出します。Flash Player は、最初にポート 843 上のマスターポリシーファイルをチェックします。マスターポリシーファイルが見つかった場合、Flash Player は、ターゲットポート上のソケットポリシーファイルを禁止するメタポリシーステートメントがファイルに含まれているかどうかをチェックします。アクセスが禁止されていない場合、マスターポリシーファイル内の適切な
allow-access-from
ステートメントが最初に検索されます。適切なステートメントが見つからない場合、メインソケット接続と同じポート上でソケットポリシーファイルが検索されます。
別の場所からソケットポリシーファイルを取得するには、次に示すように、最初に特別な「
xmlsocket
」シンタックスで
Security.loadPolicyFile()
メソッドを呼び出します。
Security.loadPolicyFile("xmlsocket://server.com:2525");
Socket.connect()
または
XMLSocket.connect()
メソッドを呼び出す前に
Security.loadPolicyFile()
メソッドを呼び出します。その場合、Flash Player は、ユーザーのメイン接続を許可するかどうかを決める前に、ユーザーのポリシーファイル要求が満たされるのを待ちます。 しかし、ターゲットの場所でポリシーファイルを提供できないことがマスターポリシーファイルで指定されている場合は、その場所にポリシーファイルが存在していても
loadPolicyFile()
への呼び出しは無効です。
ソケットサーバーを実装し、ソケットポリシーファイルを提供する必要がある場合は、ポリシーファイルを提供するのに、メイン接続を受け入れるのと同じポートを使用するか、別のポートを使用するかを決めてください。いずれの場合も、サーバーは、クライアントからの最初の送信を待ってから応答を送信する必要があります。
Flash Player は、ポリシーファイルを要求する場合、接続が確立されると同時に、必ず次のストリングを送信します。
<policy-file-request/>
サーバーはこのストリングを受信すると、ポリシーファイルを送信できます。 Flash Player からの要求は、常に null バイトによって終了し、サーバーからの応答も null バイトで終了する必要があります。
同じ接続をポリシーファイル要求とメイン接続の両方に再使用しないでください。ポリシーファイルの送信後は、接続を閉じてください。そのようにしなかった場合、Flash Player はポリシーファイル接続を閉じてから、再接続してメイン接続を設定します。