ADOBE® MEDIA SERVER 5.0.3
デベロッパーズガイド
翻訳:株式会社サムライズ |
注意
Adobe Media Server® バージョン 5についての本ドキュメントは第三者によって翻訳されたものであり、Adobe Systems Incorporated(アドビ システムズ社)は本翻訳物の正確性や完全性を査閲していません。
クライアントの認証
クライアントがアプリケーションに接続すると、サーバーは、クライアントの情報が含まれた Client オブジェクトを作成し、それをサーバーサイド ActionScript 内の application.onConnect() ハンドラーに渡します。Client オブジェクトのプロパティにアクセスするサーバーサイドコードを記述し、その値を使用して、接続を試みているクライアントの有効性を検証することができます。
application.onConnect = function( pClient ) {
for (var i in pClient) {
trace( "key: " + i + ", value: " + pClient[i] );
}
}
クライアントの IP アドレスの確認
❖ main.asc の中で client.ip の値を確認し、必要に応じてアプリケーションに対するクライアントの接続を拒否します。
if (client.ip.indexOf("60.120") !=0) {
application.rejectConnection(client, {"Access Denied"} );
}
参照元の URL の確認
❖ main.asc の中で、client.referrer の値を、アクセスを拒否する URL のリストに照らし合わせて確認します。アプリケーションに接続しようとしている SWF ファイルが、予期した場所からのものであるかどうかを確認します。リストに一致するものがある場合は、クライアントからの接続を拒否します。
referrerList = {};
referrerList["http://www.example.com"] = true;
referrerList["http://www.abc.com"] = true;
if (!referrerList[client.referrer]) {
application.rejectConnection(client, {"Access Denied"} );
}
1 クライアントサイド ActionScript で、次のコードで示すように、ローカルコンピューターの時刻と乱数を連結して固有キーを作成します。
var keyDate = String(new Date().getTime());
var keyNum = String(Math.random());
var uniqueKey = keyDate + keyNum;
2 このキーを、接続要求と共にサーバーに送信します。
nc.connect("rtmp://www.example.com/someApplication", uniqueKey);
3 main.ascファイル内の次のコードは、接続要求の中の固有キーを探します。固有キーが存在しない場合または既に使用されている固有キーの場合、接続は拒否されます。この方法によって、偽証者によるリプレイ接続の試みは失敗します。
clientKeyList = new Object(); // holds the list of clients by key
application.onConnect = function( pClient, uniqueKey ) {
if ( uniqueKey != undefined ) { // require a unique key with connection request
if ( clientKeyList[uniqueKey] == undefined ) { // first time -- allow connection
pClient.uniqueKey = uniqueKey;
clientKeyList[uniqueKey] = pClient;
this.acceptConnection(pClient);
} else {
trace( "Connection rejected" );
this.rejectConnection(pClient);
}
}
}
application.onDisconnect = function( pClient ) {
delete clientKeyList[pClient.uniqueKey];
}
Accessプラグインは、外部からの要求がアプリケーションに渡される前に、その要求をインターセプトします。Accessプラグインのプログラムを作成することによって、あらゆる認証形式を使用することができます。
関連項目
接続時に受信するユーザーエージェントの文字列に基づいて、Flash Playerを実行していないクライアントからコンテンツを保護することができます。ユーザーエージェントの文字列によって、プラットフォームと Flash Playerのバージョンが識別されます。以下にその例を示します。
WIN 8,0,0,0
MAC 9,0,45,0
この文字列にアクセスするには、次の 2 つの方法があります。
仮想キー Flash Player クライアントに基づいてストリームを再マッピングするようにサーバーを設定します。
Client.agent サーバーサイドActionScript を使用して、接続のチャレンジを行います。
application.onConnect = function( pClient ) {
var platform = pClient.agent.split(" ");
var versionMajor = platform[1].split(",")[0];
var versionMinor = platform[1].split(",")[1];
var versionBuild = platform[1].split(",")[2];
}
// output example
// Client.agent: WIN 9,0,45,0
// platform[0]: "WIN"
// versionMajor: 9
// versionMinor: 0
// versionBuild: 45
アプリケーションへの接続を許可する前に、クライアントの SWFファイルが信頼できることを検証するよう、サーバーを設定することができます。SWFファイルを検証することによって、第三者が独自の SWFファイルを作成してリソースをストリーミングすることを防止できます。SWF検証は、Flash Player 9アップデート 3以降でサポートされます。
有効なクライアントの接続元のドメインがわかっている場合は、それらのドメインをホワイトリストで管理することができます。逆に、既知の無効なドメインをブラックリストで管理することもできます。
Adaptor.xmlファイルにドメイン名の静的なリストを入力することができます。また、独自のサーバーサイドコードやファイルを使用して、これらのリストを管理することもできます。次の例では、bannedIPList.txt という名前のファイルに除外対象の IPアドレスのリストを格納しています。このファイルは随時に編集することができます。
// bannedIPList.txt file contents:
// 192.168.0.1
// 128.493.33.0
function getBannedIPList() {
var bannedIPFile = new File ("bannedIPList.txt");
bannedIPFile.open("text","read");
application.bannedIPList = bannedIPFile.readAll();
bannedIPFile.close();
delete bannedIPFile;
}
application.onConnect = function(pClient) {
var isIPOK = true;
getBannedIPList();
for (var index=0; index<this.bannedIPList.length; index++) {
var currentIP = this.bannedIPList[index];
if (pClient.ip == currentIP) {
isIPOK = false
trace("ip was rejected");
break;
}
}
if (isIPOK) {
this.acceptConnection(pClient);
} else {
this.rejectConnection(pClient);
}
}
また、特定のドメインから短時間の間に要求が来ていないかを確認するためのサーバーサイドコードを作成することもできます。
application.VERIFY_TIMEOUT_VALUE = 2000;
Client.prototype.verifyTimeOut = function() {
trace (">>>> Closing Connection")
clearInterval(this.$verifyTimeOut);
application.disconnect(this);
}
function VerifyClientHandler(pClient) {
this.onResult = function (pClientRet) {
// if the client returns the correct key, then clear timer
if (pClientRet.key == pClient.verifyKey.key) {
trace("Connection Passed");
clearInterval(pClient.$verifyTimeOut);
}
}
}
application.onConnect = function(pClient) {
this.acceptConnection(pClient);
// create a random key and package within an Object
pClient.verifyKey = ({key: Math.random()});
// send the key to the client
pClient.call("verifyClient",
new VerifyClientHandler(pClient),
pClient.verifyKey);
// set a wait timer
pClient.$verifyTimeOut = setInterval(pClient,
$verifyTimeOut,
this.VERIFY_TIMEOUT_VALUE,
pClient);
}
application.onDisconnect = function(pClient) {
clearInterval(pClient.$verifyTimeOut);
}
最終更新日 2013/9/30