bit.lyにセキュリティホール?

追記: 8/10 09:00頃だと思いますが、解消されたようですね。

追記:8/10 07:00ごろにbit.lyからまもなく問題を解消するよとメールがあったので、以下の問題は近日中に解消されると思います。

書こうか迷ったのですが、bit.lyにセキュリティホールがあるようです。
いろいろと検索した結果、すでにいくつかのソースが公開されているようなので、あえてここでもご紹介します。

こういうことが可能である旨は私からもbit.lyのサポートに報告済みです。

現象

crossdomain.xmlが非常にゆるい制限になっているため、Flashを使用した悪意のあるページに、bit.lyにログインしたままアクセスすると、メールアドレスやAPIキーを取得されます。

原因

Flashには、crossdomain.xmlというファイルで許可されているコンテンツは別のドメインからでも取得可能にするという、独自の仕組みがあります。

bit.lyは、このcrossdomain.xmlが非常にゆるい制約になっているため、別のサーバーにあるHTMLコンテンツから、bit.lyのコンテンツを取得可能になっています。

サンプル

bit.lyにログインしたまま、以下のURLにアクセスするとメールアドレスが取得されているのが、おわかりかと思います。

http://firegoby.theta.ne.jp/labo/bitly/

実際には、どこにも保存しておりませんので、ご安心下さい。

対策

bit.lyはログインしたままにしないで、こまめにログアウトするよう心がけることを、強くご推奨します。

PDFをSWFに変換するPerlスクリプト

PDFをページ毎に別々のFlashムービー(SWF)に

ある仕事でPDFをページ毎に別々のFlashムービー(SWF)に変換する必要があって以下のようなスクリプトを作りました。

AjaxとFlashの連携技になるため、最終的にはできあがったswfファイルの情報を格納したXMLを出力したり、まだまだ実装が必要な機能はありますが、とりあえずswfへの変換はできているようなので今日はここまで。

日本語のフォントはPDF側に埋め込むことで解決

日本語のフォントもどうにか処理しようとxpdf-japaneseなんかもインストールしてテストしたのですが、なぜかうまくいかなかったのと無料のPDF作成ツールでもフォントの埋め込みが可能な製品が多いことが分かったので、全てのフォントがPDFに埋め込まれていないとエラーが出るようにしました。

こんなものを誰が使うの?と思いますが、せっかく紹介するので一応動作条件を。

動作環境

変換可能なPDFは全てのフォントが埋め込まれていて、暗号化やパスワード制限がかかっていないものです。

#!/usr/bin/perl -wT

undef %ENV;

use strict;

my $pdfinfo = '/usr/bin/pdfinfo';
my $pdffonts = '/usr/bin/pdffonts';
my $pdf2swf = '/usr/bin/pdf2swf';

my $in = shift @ARGV;
my $file;

if ($in =~ /^(.+)$/ && -f $in) {
	$file = $1;
} else {
	die('file does not exists');
}

my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime();
my $time = sprintf("%04d/%02d/%02d $hour:$min:$sec", $year + 1900, $mon +1, $mday);

print "***\n";
print $time." ".$file."\n";
print "***\n";

# fontが全て埋め込まれているかをチェック
{
	my $result = `$pdffonts $file`;
	if($?){
		die('not PDF');
	}
	my @res = split(/\n/, $result);
	foreach (@res) {
		if ($_ =~ /^.+(no)\s+(yes|no)\s+(yes|no)\s+[0-9]+\s+[0-9]$/) {
			die('not embeded fonts');
		}
	}
}

# ページ数を取得
my $page; # ページ数
{
	my $result = `$pdfinfo $file`;
	if($?){
		die('not PDF');
	}
	my @res = split(/\n/, $result);
	foreach (@res) {
		if ($_ =~ /^Pages:\s+([0-9]+)$/) {
			$page = $1;
		} elsif ($_ =~ /^Encrypted:\s+yes/) {
			die('encrypted PDF');
		}
	}
}

# swfを作成
for (my $i=0; $i<$page; $i++) {
	my $p = $i + 1;
	`$pdf2swf -z -p $p -o $p.swf $file`;
	if ($?) {
		die('Error!!');
	}
}

ちなみに、PDFを単純にひとつのSWFに変換するだけならSWFToolsだけで十分です。

CrossOver – JavaScriptでクロスドメイン

JavaScriptでは、セキュリティ上の制限により、違うドメインのXMLを読み込むことができません。

一方Flashでは、crossdomain.xmlにより許可されたドメインからはXMLの取得が可能です。

そこで、FlashのExternalInterfaceを利用して、JavaScript側で指定したURLからFlashでXMLを取得して、その結果をJavaScriptに返すだけの小さなswfファイルを作成しましたので公開します。

まずは、こちらのサンプルページをご覧ください。

ダウンロード

ダウンロード(CrossOver.zip)

パッケージ内容

PHPやCGIが不要です!

  1. CrossOver.swf
  2. CrossOver.js
  3. swfobject.js

利用方法

</body>の直前あたりに以下のソースを貼り付けてください。
パスは環境にあわせて修正願います。

<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript" src="CrossOver.js"></script>

ボタンクリックなどのイベントでloadCrossOver()という関数を実行してください。
引数には、コールバック関数名及びXMLのURLを渡してください。
(コールバック関数名はダブルクォーテーション等で囲む必要があります。)

また、XMLリクエストが成功した際に実行されるコールバック関数を定義してください。

詳細は、サンプルページなどもご参照ください。

// XMLHttpリクエストをFlashにしてもらう関数
oButton.onClick = function{
  loadCrossOver( 'callback', 'http://example.com/feed.xml' );
}
// 上記関数の第一引数と同じ名前の関数を定義
function callback( XMLString ){
.......... // XMLに対する処理
}

コールバック関数の引数には、取得したXMLのString型データが渡されますので、XML.ObjTree等と併用することで、オブジェクトとして利用可能です。

ライセンス

MITライセンスとします。

ご注意

crossdomain.xmlで許可されていないサイトのXMLにはアクセスできません。
他の手を考えましょう。

Flash iTunes Cover Flow + Flickr API

Flash iTunes Cover Flowをカスタマイズして、FlickrのJSON APIを読み込めるようにしました。

これを利用すれば、Flickrの画像検索ページを作成するのも簡単です。

また、ご自身の画像を手軽にスライドショーにするブログパーツとしても利用しやすいと思います。

概要

このパッケージは、FlickrのJSON APIを読み込んで、上記のようなスライドショーを出力するための一連のファイルが含まれています。

パッケージ内には、

  • iTunesAlbumArt.fla
  • iTunesAlbumArt.swf
  • load_image.php
  • cacheディレクトリ
  • 各種ドキュメント

等が含まれています。

なお、このパッケージは、WEBER DESIGN LABS様がMITライセンスで配布しているものに対して、Flickr JSON APIに対応するよう独自の修正を加えています。

従いまして、このパッケージに関するお問い合せをWEBER DESIGN LABSにされませんようお願い申し上げます。

動作環境

PHP + GD2が必要です。

ダウンロード

以下のリンクからダウンロードしてください。
ダウンロード(Download)

利用方法

添付のドキュメントを参照してください。

オリジナルとの相違点

  • XMLの代わりにFlickrAPIのJSONを読み込むようになっています。
  • 日本語が表示されます。
  • 画像までのパスがHTMLからの相対パスだったものをswfのカレントディレクトリ内に固定しました。
  • Flickrから画像を取得してサムネールを生成するload_image.phpというファイルが追加されています。

ライセンス

本家と同じくMITライセンスとします。

ただし、気に入っていただけた方からの寄付は歓迎します。