— boreal-kiss.com

PHPの日本語標準出力を文字化けせずにFLASHに送信

FLASHのload関数で直接読み込めないファイル(異なるドメインのXMLファイル等)は、PHP等のサーバー側スクリプト言語を利用することでFLASHに読み込ませることができる。PHPを使う場合の手順は以下の通り(具体的なソース等はこちらを参照)。

  1. FLASHからPHPへ。SendAndLoad関数等を用いてPHPへ読み込みたいファイルのURLを送信する。
  2. PHP内部処理。PHPのreadfile関数等で指定されたファイルを読み込む。
  3. PHPからFLASHへ。読み込んだファイル内容(標準出力)をFLASHのSendAndLoad関数の返り値に送り返す。
  4. FLASH内部。SendAndLoad関数の返り値を受け取って続きの処理へ。

しかし、FLASHの日本語文字コードはShift-JISとUTF-8にしか対応していないので(FLASH ActionScript辞典より。ちなみにクソ本)、EUC-JPで記述されたブログ(FC2等)のXMLファイルをPHPでそのまま読み込んでFLASHに送り返すと文字化けしてしまう。そこでPHPで読み込んだファイル内容を文字コードを変換してからFLASHに送り返す必要がある。以下はPHPからFLASHへUTF-8にエンコーディングしてから送るためのPHP内部の処理。


<?php

//readfile関数の内容を標準出力せずに内部バッファに保存させる
ob_start();

//FLASHから送信されたURL先のファイル内容を読み込む(標準出力されない)
readfile($_POST['url_from_flash']);

//内部バッファに保存された内容を変数に格納する
$str = ob_get_contents();

//内部バッファの開放
ob_end_clean();

//上記で変数に格納された内容がEUC-JP, Shift-JIS, UTF-8の場合、UTF-8に再エンコーディング
echo mb_convert_encoding($str,'UTF-8', 'EUC-JP,Shift_JIS,UTF-8');

//UTF-8にエンコーディングされた内容を標準出力(出力内容がFLASHへ送信される)
echo $str;
?>

追記(2007/12/17): なんかコードがダメ出しされてる。ただ肝心な部分のフィードバックがないので何がダメなのかわからず終い。

追記(2007/12/19): 先方で詳細コメント・解説をもらえた。単独では知り得なかった現在の状況が把握できたので有益なTB。

3 comments
  1. よくきたはてダ says: 2007年12月17日1:55 PM

    [PHP] まだまだ生産されるセキュリティホール

    http://blog.boreal-kiss.com/2007/12/17113928.html いい情報っすね!!ってサンプル見てみると <…

  2. itoh says: 2007年12月17日6:04 PM

    $_POST[‘url_from_flash’]
    には、’../../../../etc/passwd’とか入れられるので、そのサーバにどのユーザーが居るかの情報も抜かれたりしますよって話だったりします。

    あと、$_POST[‘url_from_flash’]には、http://…..を想定されていると思いますが、それを許可すると他のサーバへの攻撃経路にされますよっていう話でもあったり。

    なので、
    readfile($_POST[‘url_from_flash’]);
    ってやらないで、せめて
    readfile(dirname(__FILE__).preg_replace(“/(\0|\.)/”,””,$_POST[‘url_from_flash’]));
    くらいはやった方がいいです。
    $_POST[‘url_from_flash’]
    には、英数半角文字しか来させないとかチェックしましょうという、セキュリティの一番基礎的な部分の突っ込みです。

    ************

    itohさん>>
    フォローありがとうございます。踏み台にされる原理が今イチわかっていないのですが、”http://”では第三者に迷惑がかかる可能性があるわけですね。
    Boreal Kiss (管理人)

  3. よくきたはてダ says: 2007年12月19日6:46 AM
Submit comment