Установка session_id ненадежна при использовании flash для отправки данных - PullRequest
1 голос
/ 31 июля 2010

Я использую PHP версии 5.3.2 на локальном сервере разработки и на удаленном веб-сервере.

Я пытаюсь использовать uploadify для загрузки нескольких файлов на сервер. В получающем сценарии я хотел бы использовать данные, хранящиеся в сеансе, однако, поскольку uploadify отправляет файлы в сценарий с использованием Flash, он не отправляет cookie сеанса.
Обходной путь для этой проблемы состоит в том, чтобы загружать в GET или POST идентификатор сеанса к сценарию, однако я считаю это очень ненадежным. В моем сценарии у меня есть следующее:

<?php
ini_set('session.use_only_cookies', FALSE);
ini_set('session.use_trans_sid', TRUE);
session_name('SESSNAME');
session_start();
print_r($_SESSION);

URL-адрес скрипта похож на script.php? SESSNAME = sessionid , и я попытался использовать прозрачные идентификаторы сеанса, как указано выше, а также вручную установить идентификатор с помощью session_id ($ _ GET ['SESSNAME']).

Этот всегда работает при непосредственном доступе к сценарию через браузер и отправке текущего идентификатора сеанса, даже если я вручную удаляю файл cookie сеанса. Это также всегда работает с uploadify на моем локальном сервере. Однако при использовании uploadify на удаленном сервере он работает примерно в 20% случаев совершенно случайно. Там нет шаблона. Казалось, он работал с большей частотой, когда я добавил

ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);

к сценарию, однако это могло быть просто совпадением.

Есть идеи?

Информация о локальном сервере: hxxp: //www.dur.ac.uk/n.r.brook/info_local.php
Информация об удаленном сервере: hxxp: //www.dur.ac.uk/n.r.brook/info.php
(извините за hxxp, у вас нет прав на размещение нескольких ссылок!)


Некоторые предположения ...

Если немного покопаться и посмотреть на заголовки, которые получает скрипт, я думаю, что, возможно, решил проблему.
Вам необходимо отправить идентификатор сеанса при использовании uploadify, потому что flash не отправляет куки при использовании метода FileReference.upload () (я думаю!). Однако, как и идентификатор сеанса, в средах с балансировкой нагрузки (например, на удаленном сервере) есть также файл cookie BALANCEID, который определяет, с каким сервером в данный момент работает пользователь. Flash не отправляет этот файл cookie, поэтому балансировщик нагрузки иногда отправляет запрос на другой сервер, и на этом сервере сеанс не существует.

Я проверил это поведение, установив переменную сеанса после того, как напечатал сеанс. Эта проблема и повторная отправка файлов показывают проблему - сначала я получаю пустой массив, но несколько переменных в переменной начинают появляться.

Итак, если все вышеприведенное верно, то мой вопрос: что я могу сделать, чтобы заставить флэш-память отправлять эти данные с загрузкой, чтобы балансировщик нагрузки знал, какой сервер использовать? Или это безнадежное дело?


Ответ?

После дальнейших исследований я обнаружил следующий пост - hxxp: //swfupload.org/forum/generaldiscussion/977
Это говорит о том, что файлы cookie не могут быть отправлены с помощью FileReference.upload (), и поэтому uploadify не может использоваться с серверами с балансировкой нагрузки, если вы хотите использовать данные сеанса. Тем не менее, я думаю, что теперь я попытаюсь найти решение, которое сохранит данные, связанные с идентификатором сессии, в файл. Сценарий получения загрузки может открыть этот файл и извлечь необходимые данные.
Это мой первый опыт работы с чем-либо на основе Flash, но это не улучшило мое мнение о технологии!

Ответы [ 2 ]

0 голосов
/ 01 сентября 2011

Существует способ использования файлов cookie при отправке с flash.Cookies необходимы для php, чтобы найти идентификатор хранилища сессии.Значение, которое хранится в cookie, является действительным идентификатором сеанса, а имя cookie в большинстве случаев является именем сеанса.Получить сессию в php нельзя, набрав $ _SESSION ['name'], но вы можете создать собственную библиотеку сессий, которую вы включили.Это позволит php получить все значения nassery, и вы сможете продолжить.

Вот библиотека сессий, которую я собрал в php:

function SESSION_OPEN($PATH,$NAME){
    global $SESSION_PATH, $SESSION_NAME;
    $SESSION_PATH=$PATH;
    $SESSION_NAME=$NAME;

    return(true);
}

function SESSION_CLOSE(){
    return(true);
}

function SESSION_GET($ID){
    global $SESSION_PATH, $SESSION_NAME;
    $STR_PATH="$SESSION_PATH/USES_".session_id()."_$ID";

    if($RESOURCE = @fopen($STR_PATH,"r")){
        $CONTENT = @fread($RESOURCE ,filesize($STR_PATH));  
        return($CONTENT);   
    }else{
        return(false);  
    }
}

function SESSION_PUT($ID,$VALUE){
    global $SESSION_PATH, $SESSION_NAME;
    $STR_PATH="$SESSION_PATH/USES_".session_id()."_$ID";

    if($RESOURCE = @fopen($STR_PATH,"w")){
        fwrite($RESOURCE , $VALUE );    
        return(true);   
    }else{
        return(false);  
    }
}

function SESSION_DEST($ID){
    global $SESSION_PATH, $SESSION_NAME;
    $STR_PATH="$SESSION_PATH/USES_".session_id()."_$ID";

    return(@unlink($STR_PATH));
}

function SESSION_GC($MAX_EXECUTION){
    return(true);   
}

session_set_save_handler("SESSION_OPEN","SESSION_CLOSE","SESSION_GET","SESSION_PUT","SESSION_DEST","SESSION_GC");
0 голосов
/ 31 июля 2010

Мое решение этой проблемы:

На странице загрузки:

 file_put_contents($some_folder.'/'.session_id(), serialize($just_the_vars_you_will_be_using));

В вашем javascript, который загружает uploadify:

 var start = document.cookie.indexOf("PHPSESSID=");
 var end = document.cookie.indexOf(";", start); // First ; after start
 if (end == -1) end = document.cookie.length; // failed indexOf = -1
 var cookie = document.cookie.substring(start+10, end);
 $('#fileInput').uploadify({
            'uploader'  : 'uploadify.swf',
            'script'    : 'uploadify.php',
            'cancelImg' : 'cancel.png',
            'auto'      : true,
            'multi'     : true,
            'scriptData': { SESSID : cookie }
 });

В скрипте, который получает файлы:

 $vars = unserialize(file_get_contents($some_folder.'/'.$_POST['SESSID']));

Если вы хотите написать обратно в «сессию» в этом скрипте, в конце:

 file_put_contents($some_folder.'/'.$_POST['SESSID'], serialize($vars));

Насколько я знаю, с этим не должно быть проблем безопасности, так как вы будете использовать только несколько переменных, хранящихся в файле (я храню только инкрементное значение и временный путь к файлу). Убедитесь, что в файле $ some_folder есть файл index.html, чтобы предотвратить вывод списка файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...