SWFファイルの再配布を防止するには(Flash8以前環境編)

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

前回SWFファイルの再配布防止処理について説明しましたが、
以下のような環境では実践が難しいかと思います。
 ・Macromedia Flash 8 Professional以前のツールしか手元にない方
 ・swfmillがインストールできない環境の方
 →参照:「swfmillでケータイFlashを動的生成してみよう(インストール編)」
 
ちょっと裏技的なやり方になってしまいますが、解決方法を紹介しておきます。
 
前回の記事:
→参照:「SWFファイルの再配布を防止するには」
 
 

SWFファイルのフォーワードロックの概要

SWFファイルのバイナリレベルのあまり細かい話は難しくなりますし、筆者も厳密に把握しきれていませんので概要のみ説明します。
 
XMPデータを含むSWFファイルは以下のような構造になっています。

SWFのヘッダ部分 XMPデータを含む部分 その他SWFデータ本体

※上記は説明のため色々と省略してかなり適当に書いています。
厳密には実際の内容と異なる部分がある場合があります。ご了承下さい。
 
そして、このヘッダ部分にはSWFファイル全体のファイルサイズがバイナリで記述されています。
また、XMPデータを含む部分にもXMPデータ全体のファイルサイズがバイナリで記述されています。
 
フォワードロックのXMLを追記してこのファイルサイズのバイナリデータも調整すれば解決するのですが処理がかなり複雑になります。
 
そこで、
・挿入するフォワードロックのXMLタグと同じ文字数の文字列をタイトルにセットしておく
・出力時に該当文字列を削除してフォワードロックのXMLデータを挿入する
という方法を使うと、同じXMPデータの内部を変更するだけなのでバイナリで記述されているファイルサイズの数値を調整する必要なく、フォワードロックをかける事ができます。
 
sample3089.swf(置換前)

(前略)
<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>123456789012345678901234567890123456789</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>
(後略)

 
※実際はバイナリ内では改行されませんが説明のために改行をつけています。
※実際の内容はSWFファイルをバイナリエディタで開いてご確認下さい。
→参照:バイナリエディタ BZ
 
 

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

・Macromedia Flash 8 Professional以前
ドキュメントプロパティ→サイズのボタンをクリック
タイトルに39文字の文字列(例えば「123456789012345678901234567890123456789」など)を記述してOKをクリック
[図121]
パブリッシュしてSWFファイルを出力
 
※タイトルに設定する文字列は上記文字列である必要はありません。
Flash内で使用しているものと重複しないようにだけ注意して下さい。
 
※説明欄に入力しても大丈夫です。
 
※SEO対策でタイトル・説明を設定する場合はタイトルの後に上記文字列を入れてもOKです。
 
 

PHPソースサンプル

SWFの再配布を防止するサンプルを挙げておきます。
上記手順で事前にSWFファイルにプロパティからタイトルを設定しておいてください。
 
sample3089.php

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

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

// ダミーのタイトルを消去
// ダミーのタイトルはフォーワードロックのXMLと同じ文字数(39文字)
$swfData = str_replace('123456789012345678901234567890123456789', '', $swfData);

// フォーワードロックのXMLを挿入
$swfData = str_replace('</rdf:Description>', 
    '<swf:forwardlock>True</swf:forwardlock></rdf:Description>', $swfData);

// SWFのヘッダを出力
header('Content-type: application/x-shockwave-flash');

// ソフトバンク向け画像保存防止処理
header("x-jphone-copyright: no-store, no-transfer, no-peripheral");

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

// 出力結果をファイルに保存する例
// file_put_contents('sample3089_locked.swf', $swfData);

?>

 
※上記PHPファイルはUTF-8で記述します。
 
※環境によってはサーバーのエンコード設定にも注意して下さい。
 
※上記ではキャリア別に分けずに出力していますが、特に問題なく全キャリアで表示できます。
 
 

使用方法

1.
静的に配置して使いたい場合は、
・あらかじめファイルのタイトルに39文字の文字列を入力してからSWFをパブリッシュする
・上記処理を「出力結果をファイルに保存」するように修正して実行。
・PHPで出力したSWFファイルをサーバーに配置
・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>

 
2.
複数のSWFファイルに対して実行したいなど、動的処理で行いたい場合は
・あらかじめ全ファイルのタイトル(説明の部分でも構いません)に39文字の文字列を入力しておく
・上記コードを介してSWFファイルを出力するようにする
 
 

備考

1.
その他の内容については前回の記事をご参照下さい。
前回の記事:
→参照:「SWFファイルの再配布を防止するには」
 
2.
本記事の手法に関しては全ての機種で動作確認を行ったものではありません。
対策を実施されたことによる損害等の責任につきましては負いかねますので、その点ご了承いただきますようお願い致します。
 
3.Flash Lite 2.0以上でパブリッシュした場合にDoCoMoの一部端末でロックが有効にならない報告を頂いています。
再配布防止処理の問題ではなく機種側の問題と考えられます。
→参照:「SWFファイルの再配布を防止するには-備考4」
 
 

実行例

実行例はこちらからご確認下さい。

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

関連URL

SWFバイナリ関連のURL
Flash SWF バイナリ – Yoya Wiki
http://pwiki.awm.jp/~yoya/?Flash/SWF
→SWFバイナリの詳細について参考になります。