Eksik crossdomain.xml aşmak için PHP proxy komut - küçük tweaks eksik

0 Cevap php

1 background - böylece ben kötü niyetli bir şey çalışıyorum değilim ki, bakın: ben kullanıcı avatarları görüntüler Rus sosyal ağ vkontakte.ru bir flash uygulaması var. Şimdiye kadar benim. Swf dosyası, kendi etki barındırılan olmuştur ki getiriliyor ve scaling avatarlar iyi çalıştı.

. Swf benim etki ev sahipliği yapacak ki şimdi ben, bir iframe tipi benim app geçmek istiyorum ve bu nedenle ben artık benim swf içinde avatarları ölçekli mümkün değilim: * "benim ne etki, ne. "http://vkontakte.ru/crossdomain.xml listelenen ve böylece. swf indirmek ve avatarları görüntüleyebilir, ancak (myLoader.content SecurityError atar erişen) artık onları ölçek olamaz.

Ben komut ?img= parametre ve sonra sadece (bazı kontrollerden sonra ve bir şey saklamak olmadan) stdout onu geçmek belirtilen görüntü almak istiyorsunuz PHP bir proxy senaryo yazmaya karar verdim:

<?php

define('MAX_SIZE', 1024 * 1024);

$img = $_GET['img'];
if (strpos($img, '..') !== false ||
    !preg_match(',^http://[\w.]*vkontakte\.ru/[\w./?]+$,i', $img))
        exit();

$opts = array(
        'http'=>array(
                'method' => 'GET',
                'header' => "Accept-language: en\r\n" .
                            "Cookie: foo=bar\r\n"
        )
);

$ctx = stream_context_create($opts);
stream_context_set_params($ctx, array('notification' => 'callback'));
$fp = fopen($img, 'r', false, $ctx);
fpassthru($fp);
fclose($fp);

function callback($code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) {
        if ($code == STREAM_NOTIFY_FILE_SIZE_IS && $bytes_max > MAX_SIZE)
                exit();

        if ($code == STREAM_NOTIFY_PROGRESS && $bytes_transferred > MAX_SIZE)
                exit();

        if ($code == STREAM_NOTIFY_MIME_TYPE_IS) {
                $mime = strtolower($message);
                switch($message) {
                        case 'image/gif':
                        case 'image/png':
                        case 'image/jpg':
                        case 'image/jpeg':
                                // XXX this doesn't work XXX
                                header('Content-Type: ' . $mime);
                                break;
                        default:
                                exit();
                }
        }
}

?>

Benim sorunum $ mim başlık yazdırılır asla olmasıdır (veya çok geç basılır?).

When I fetch for example my avatar directly: http://cs971.vkontakte.ru/u59751265/a_7567890a.jpg then I see the Content-Type: image/jpeg header being sent to the browser.

Ben proxy komut dosyası aracılığıyla getir Ama, ben bu başlığı görmüyorum.

Belki daha iyi fopen yerine farklı bir işlev () kullanmak gerekir? PHP çok yetkin değilim. Fopen Ayrıca eğer ben endişeliyim () web sunucusu yerel dosyaları hizmet içine kandırdın olabilir.

Ve bir bonus soru olarak: benim swf benim proxy.php çağırıyor sadece app olmayacaktır endişeli değilim, ama onu korumak için iyi bir yol (belki böyle bir yolu yoktur) çözemiyorum - I can. .. 'benim swf ve php bir sır saklamak -. swf demonte edilebilir çünkü.

Teşekkürler, Alex

0 Cevap