SWFファイルの再配布を防止するには

By ookura - 09/03/27 - このエントリをはてなブックマークに追加このエントリをYahoo!ブックマークに追加このエントリをdel.icio.usに追加このエントリをFC2ブックマークに追加

今回は携帯でのSWFファイルの再配布防止処理について説明します。
→参照:「画像の再配布を防止するには」
 
 

SWFファイルの再配布とは

ケータイではキャリアや機種によってサイトからFlashのSWFファイルをダウンロードしたり外部に転送したりすることができます。
ダウンロードしたSWFファイルの外部への転送方法には、メールに添付して転送、SDカード等のメモリ経由で転送、赤外線送信を利用した転送などがあります。
端末へのダウンロードに関しては全てを防ぎきることはできないですが、端末から外部への転送を防止することが可能です。
 
 

SWFファイルの再配布を防止するには

再配布を防止する方法は、キャリアによって異なります。
 
▼DoCoMo
▽Flash Lite 1.0 /Flash Lite 1.1搭載機種の場合
全て転送できない仕様ですので特に対策は不要です。
 
▽Flash Lite 3.0/Flash Lite 3.1搭載機種の場合
XMPメタデータのフォワードロックを有効にすれば転送できなくなります。
ただし同一機種間のSDカード転送は可能です。
フォワードロックの設定はAdobe Flash CS4で可能です。
XMPメタデータはSWF内にXMLデータとして記述されています。
 
FlashCS3,Flash8では直接XMPメタデータのフォワードロックはできませんが(FlashCS3は追加インストールで設定可能です→※備考4)、
タイトルを入力するとXMPメタデータが記述された状態になりますので、
それから該当XMLデータを変更すれば設定可能です。

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/1.1/">
        <dc:title>タイトル</dc:title>
    </rdf:Description>
</rdf:RDF>

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/1.1/">
        <dc:title>タイトル</dc:title>
        <swf:forwardlock>True</swf:forwardlock>
    </rdf:Description>
</rdf:RDF>

▼au
全て転送できない仕様ですので特に対策は不要です。
 
▼Softbank
標準では保存・転送共に可能です。
以下ヘッダ出力で端末保存・転送不可が設定可能です。
.htaccessで設定する場合

<Files ~ "\.swf$">
Header set x-jphone-copyright "no-store"
Header append x-jphone-copyright "no-transfer"
Header append x-jphone-copyright "no-peripheral"
</Files>

.htaccessで設定する場合はウェブサーバーでmod_headerが有効になっている必要があります。
サーバー設定を確認するか、実際に上記.htaccessを配置してうまくいくかどうかを確認します。
 
CS4でフォーワードロックを付けて書き出している場合は、
上記の.htaccessファイルとSWFファイルを同じディレクトリに配置してSWFファイルにアクセスすればOKです。
 
・PHPで動的にフォワードロックを掛ける際に設定する場合

header('x-jphone-copyright "no-store, no-transfer, no-peripheral"');

 

Softbankの端末保存不可設定について

保存を許可する場合は「no-store」の項目を外せばよいのですが、
その場合、端末によってSDカードへの転送もしくはメール転送できる場合があります。
 
例えばダウンロード可能のコンテンツなどでSoftbank端末で保存を許可する場合は、
完全に転送不可にすることはできないようです。
 
 

SWFファイルへのメタデータ設定手順

・Adobe Flash CS4(FlashCS3は追加インストールで設定可能です→※備考4
プロパティ→プロファイル→「編集」をクリック
[図116]
FlashタブのSWF設定で「XMPメタデータを含める」にチェックが入っていることを確認し、「ファイル情報」をクリック
[図117]
モバイルSWFタブの「フォーワードロック」にチェックを入れて「OK」をクリック
※ドキュメントタイトルは入力しなくても影響はありません。
[図118]
 
 
・Adobe Flash CS3以前
ドキュメントプロパティ→サイズのボタンをクリック
[図119]
タイトルに文字列を記述してOKをクリック
[図120]
 
 

PHPソースサンプル

SWFの再配布を防止するサンプルを挙げておきます。
上記手順で事前にSWFファイルにプロパティからタイトルを設定しておいてください。
このサンプルではSWFファイルの置換処理にswfmillを使用していますのでswfmillをインストールした環境で実行して下さい。
→参照:「swfmillでケータイFlashを動的生成してみよう(インストール編)」
 
sample3008.php

<?php
/* 
 * SWFファイルに再配布防止処理をつけて出力するサンプル
 */

// ユーザーエージェント判別
$userAgent = $_SERVER['HTTP_USER_AGENT'];
if (preg_match('/^DoCoMo/', $userAgent)) {
    $carrier = 'DoCoMo';
} elseif (preg_match('/^(J\-PHONE|Vodafone|SoftBank|MOT\-)/', $userAgent)) {
    $carrier = 'SoftBank';
} elseif (preg_match('/^(KDDI\-|UP\.Browser)/', $userAgent)) {
    $carrier = 'au';
} else {
    echo 'Error : Out of allowed carrier.';
    exit;
}

// SWFファイルの内容を取得
$swfData = file_get_contents('sample3008.swf');

if ($carrier === 'DoCoMo') {
    // XMPデータがあれば
    if (preg_match('/<\/rdf:Description>/', $swfData)) {
        // forwardlock設定があれば
        if (preg_match('/<swf:forwardlock>/', $swfData)) {
            // forwardlock設定が無効であれば
            if (preg_match('/<swf:forwardlock>False<\/swf:forwardlock>/', $swfData)) {
                // forwardlock設定を有効にする
                $replaceStrings = array(
                    "<swf:forwardlock>False</swf:forwardlock>" => "<swf:forwardlock>True</swf:forwardlock>",
                );
            }
        // forwardlock設定がなければ
        } else {
            // forwardlock設定を挿入する
            $replaceStrings = array(
                "</rdf:Description>" => "<swf:forwardlock>True</swf:forwardlock></rdf:Description>",
            );
        }
        if (count($replaceStrings) > 0) {
            // SWFからXMLに変換
            
            // コマンド実行時の入出力とエラー出力先を指定
            $descriptorspec = array(
               0 => array("pipe", "r"),
               1 => array("pipe", "w"),
               2 => array("file", "error-output.txt", "a")
            );
            
            // swfmillコマンドを実行してリソースとファイルポインタを取得
            $process = proc_open('/usr/local/bin/swfmill -e cp932 swf2xml stdin stdout', $descriptorspec, $pipes);
            
            if (is_resource($process)) {
                // 標準入力にSWFファイルのバイナリデータを書き込み
                fwrite($pipes[0], $swfData);
                fclose($pipes[0]);
                
                // 標準出力からXMLデータを読み込み
                $xmlString = stream_get_contents($pipes[1]);
                fclose($pipes[1]);
                
                // パイプを全て閉じてからプロセスを閉じる
                proc_close($process);
            }
            
            foreach($replaceStrings as $key => $value){
                $xmlString = str_replace($key, $value, $xmlString);
            }
            
            $descriptorspec = array(
               0 => array("pipe", "r"),
               1 => array("pipe", "w"),
               2 => array("file", "error-output.txt", "a")
            );
            
            // swfmillコマンドを実行してリソースとファイルポインタを取得
            $process = proc_open('/usr/local/bin/swfmill -e cp932 xml2swf stdin stdout', $descriptorspec, $pipes);
            
            if (is_resource($process)) {
                
                // 標準入力にXMLデータを書き込み
                fwrite($pipes[0], $xmlString);
                fclose($pipes[0]);
                
                // 標準出力からSWFファイルのバイナリデータを読み込み
                $swfData = stream_get_contents($pipes[1]);
                fclose($pipes[1]);
                
                // パイプを全て閉じてからプロセスを閉じる
                proc_close($process);
            }
        }
    // XMPデータがなければ
    } else {
        echo 'Error : This File not contains XMP data.';
        exit;
    }
}

// SWFのヘッダを出力
header('Content-type: application/x-shockwave-flash');
// ソフトバンクの場合は画像保存防止のヘッダを書き出す
if ($carrier === 'SoftBank') {
    // ソフトバンク向け画像保存防止処理
    header("x-jphone-copyright: no-store, no-transfer, no-peripheral");

}
// SWFのデータを出力
echo $swfData;
?>

 
※上記PHPファイルはUTF-8で記述します。
 
※Flash Lite2.0以上の場合はコマンド実行時の「-e cp932」オプションは外します。
 
※上記ではキャリア別に処理を分けましたが、キャリア別に分けずに全キャリアでforwardlock設定を追加してソフトバンク用のヘッダを追加しても問題ないようです。
 
 

対策パターン

1.
Flash CS4をお持ちの場合は、以下の対策でOKです
・CS4でフォワードロックをつけて書き出し
・.htaccessを配置してSoftbankの転送対策
 
2.
Flash CS4をお持ちでない場合や、動的に出力する必要がある場合は以下の方法になります。
・Flashでタイトルをつけて書き出し
・PHPでswfmillを使用して
 ・forwardlock設定を挿入
 ・Softbankヘッダ出力
 ・swfデータ出力
 
※2.で出力したファイルはフォワードロックが有効ですので、
一旦保存してから1.のように.htaccessとセットで静的なSWFファイルとして配置しても大丈夫です。
 
 

備考

1.
上記対策を行ってもPCからアクセスできてしまうと意味がありませんので、キャリアIPでアクセス制限をかけておく必要があります。
 
2.(2009/3/31 追記)
本記事の手法に関しては全ての機種で動作確認を行ったものではありません。
対策を実施されたことによる損害等の責任につきましては負いかねますので、その点ご了承いただきますようお願い致します。

 
3.(2009/3/31 追記)
DoCoMo P905iで以下の問題があるというご報告をいただいております。
(beinbeerさん、貴重なご報告ありがとうございます!)
 
・Flash CS4でフォワードロックを設定してFlash Lite 2.0以上でパブリッシュしたSWFファイルがDoCoMo P905iではメールで転送できてしまう
※Flash Lite 1.1でパブリッシュしたデータについては問題なく再配布防止が有効になっているようです。
 
その他のDoCoMo機種でも同様の問題がある可能性がありますので、「一部の機種で再配布防止が有効にならない場合がある」ということをご承知の上で、実装して頂きますようお願い致します。

 

4.(2009/3/31 追記)
Adobe Flash CS3でもAdobeより配布されているCDKに同梱されている「Flash CS3 メタデータパネル」をインストールすることでXMPデータ及びフォーワードロックを設定することが可能です。
Adobe – モバイル & デバイスデベロッパーセンター : 各種開発キット
http://www.adobe.com/jp/devnet/devices/development_kits.html
→Flash Lite 3.0 対応 NTT DoCoMo 携帯電話用 Adobe Flash CDK
 

実行例

実行例はこちらからご確認下さい。
1.Flash Lite 1.1パブリッシュ版サンプル

URLをメールで送る
http://ookura.tanikaze.com/Sample/post3008/
 
2.各Flash Liteパブリッシュバージョン別サンプル
※Flash Lite1.1~3.1までの各バージョンでパブリッシュしたものです。
※フォワードロック&Softbank用保存防止処理済みです。

URLをメールで送る
http://ookura.tanikaze.com/Sample/post3008/test/
 
 

動作確認のお願い

FlashでフォーワードロックをかけてFlash Lite 2.0以上でパブリッシュしたSWFファイルに関してDoCoMoの一部の機種で再配布防止が有効にならないケースがあることが判明しました。
上記の問題がある機種を特定できればSWFファイルの再配布防止に関する有力なデータとなるのですが、筆者の環境では確認できる機種に限界があります。
 
そこで、もし無償にてご協力頂ける方がいらっしゃいましたら、上記「実行例2」の「Flash Lite 2.0」版を端末に保存してメールで転送できるかどうか、コメント欄よりご一報頂ければ幸いです。
確認報告を頂けましたら結果を逐次掲載させて頂きます。
特にDoCoMo 905i,906iシリーズユーザーの方、コメントお待ちしております!
 
▼確認フロー:
1.上記「実行例」2.のURLにケータイでアクセス

2.「Flash Lite 2.0でパブリッシュ」の下のリンクをクリック

3.ここでFlashが表示できない場合→「結果:表示できませんでした」でコメント

4.表示できれば端末に保存
ここでFlashが保存できない場合→「結果:保存できませんでした」でコメント

5.保存できれば保存したファイルをメールに添付してみる
ここで添付できない場合→「結果:メールに添付できませんでした」でコメント

6.メールに添付できた場合→「結果:メール転送できました」でコメント
 
▼報告コメント例:
機種名:P905i
確認ファイル:Flash Lite 2.0版
結果:メール転送できました。
 
 

再配布防止動作確認結果

参考のため、上記「実行例2」のファイルについての動作確認結果を掲載しておきます。

キャリア 機種名 対応バージョン FL1.1 FL2.0 FL3.0 FL3.1
DoCoMo SH-03A ~FL3.1 転送不可 転送不可 転送不可 転送不可
DoCoMo P905i ~FL3.0 転送不可 転送可 転送可 転送可
au CA001 ~FL3.1 転送不可 転送不可 転送不可 転送不可
au W53SH ~FL2.0 転送不可 転送不可 表示不可 表示不可
SoftBank 912T ~FL2.0 保存不可 保存不可 表示不可 表示不可

※上記「FL1.1」は「Flash Lite 1.1」の略です。
 
 

関連URL

iモード向けFlashRの特徴 – サービス・機能 – NTTドコモ
http://www.nttdocomo.co.jp/service/imode/make/content/flash/feature/index.html
再配布不可識別子 – サービス・機能 – NTTドコモ
http://www.nttdocomo.co.jp/service/imode/make/content/drm/redistribution/
再配布不可識別子 – サービス・機能 – NTTドコモ Flash
http://www.nttdocomo.co.jp/service/imode/make/content/drm/redistribution/browser/index.html#p04
→ドコモの公式サイトに再配布防止に関する説明があります。
 
Flashで swf に検索メタデータを埋め込む – yoshiweb.NET
http://yoshiweb.net/blog/?itemid=201
→検索メタデータの埋め込み方法について説明があります。
 
swfファイルの再配布防止について-ソフトバンククリエイションコミュニティ
https://secure.okweb3.jp/mobilecreation/EokpControl?&tid=11532&event=QE0004
→Softbankの再配布防止方法について説明があります。
 
Adobe FlashLite CDK
http://www.adobe.com/jp/devnet/devices/development_kits.html
→フォーワードロックの仕様についての詳細な情報はCDKをご参照下さい。
Adobe Flash CS3用の追加モジュールも配布されています。(→※備考4参照)
 
mxmlcの使い方とコンパイルオプションを勝手に解説 – ◆nemu90kWw.の雑記
http://d.hatena.ne.jp/nemu90kWw/20060716/p1
→Flexからswfを作成する場合はメタ情報の書き込み関連が参考になるかもしれません。
 
 

備考

XMPメタデータの設定を行う際、Adobe Flash Professional CS3では別途CDKのインストールが必要になるようです。
FOMA Flashlite3.x をコピー禁止にする-てくめも@coop
http://www.ecoop.net/memo/2009-07-14-1.html
 
 

関連ページ

ケータイFlash関連の記事一覧