Question

1er l'arrière-plan - de sorte que vous voyez, que je ne suis pas d'essayer quoi que ce soit malveillant: J'ai une application flash dans le vkontakte.ru du réseau social russe qui affiche les avatars des utilisateurs. Jusqu'à présent mon fichier .swf a été hébergé dans leur domaine, de sorte que l'extraction et échelle avatars a bien fonctionné.

Maintenant, je voudrais passer mon application à un iframe de type, de sorte que le .swf sera hébergé dans mon domaine et donc je ne suis pas en mesure d'escalader les avatars dans mon .swf plus: ni mon domaine, ni « * » sont répertoriés dans http://vkontakte.ru/crossdomain.xml et donc le .swf peuvent télécharger et afficher les avatars, mais ne peut pas les plus grande échelle (accès myLoader.content lance SecurityError).

J'ai décidé d'écrire un script en PHP proxy qui chercher l'image spécifiée dans les scripts ? Img = paramètre , puis juste passer à la stdout (après quelques vérifications et sans enregistrer quoi que ce soit) :

<?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();
                }
        }
}

?>

Mon problème est que l'en-tête mime $ est jamais imprimé (ou est imprimé trop tard?).

Quand je vais chercher par exemple mon avatar directement: http://cs971.vkontakte.ru/u59751265/a_7567890a.jpg alors je vois le Content-Type:. image / jpeg en-tête envoyé au navigateur

Mais quand je vient le chercher dans mon script proxy, je ne vois pas cet en-tête.

Peut-être que je devrais mieux utiliser une autre fonction au lieu de fopen ()? Je ne suis pas très compétent en PHP. Aussi je suis inquiet si fopen () peuvent être dupés en service de fichiers locaux de mon serveur web.

Et comme une question bonus: Je suis inquiet que mon .swf ne sera pas la seule application d'appeler mon proxy.php, mais je ne peux pas trouver un bon moyen de le fixer (peut-être il n'y a pas de telle façon) - Je ne peux pas stocker un secret dans mon .swf et dans le .php -. parce que le .swf se démonte

Merci, Alex

Était-ce utile?

La solution

Je crois que votre première hypothèse est juste, vous envoyez l'en-tête trop tard ou vous ne recevez pas les en-têtes de mime que vous attendez.

Tout d'abord, essayez de vous connecter en utilisant les mimes file_put_contents , alors si vous trouvez qu'il est bien trop tard pour être d'une quelconque utilité, vous pouvez regarder , HTTP peut-être?

Pour votre question bonus; la page de l'iframe est hébergé sur un serveur, sur ce serveur, vous êtes probablement PHP en cours d'exécution, créez une session avec session_start() , ensemble $_SESSION['gotvisit'] = TRUE (ou quelque chose comme ça). Ensuite, récupérer l'identifiant de session en utilisant $id = session_id() , cet identifiant, vous pouvez maintenant passer à votre flash avec des variables de flash standard. Le flash passe cette variable dans la demande de l'image, à côté dans votre script img, faire;

session_id($_GET['ses']);
session_start();
if(!isset($_SESSION['gotvisit']))
    die('no access');

Bonne chance à vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top