代码之家  ›  专栏  ›  技术社区  ›  Nick

使用闪存发送数据时设置会话id不可靠

  •  1
  • Nick  · 技术社区  · 14 年前

    我在本地开发服务器和远程web服务器上都使用phpversion5.3.2。

    我试着用 uploadify 将多个文件上载到服务器。在接收脚本中,我想使用会话中存储的数据,但是因为uploadify使用flash将文件发送到脚本,所以它不会发送会话cookie。
    在我的脚本中,我有以下内容:

    <?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= 会话ID 我也尝试过使用透明会话id(如上所述),并使用session\u id($\u GET['SESSNAME'])手动设置id。

    总是 使用浏览器直接访问脚本并发送当前会话id时有效,即使手动删除会话cookie也是如此。它也总是在我的本地服务器上与uploadify一起工作。然而,在远程服务器上使用uploadify时,它的工作时间约为20%,完全是随机的。没有模式。当我加上

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

    本地服务器信息: http://www.dur.ac.uk/n.r.brook/info_local.php
    http://www.dur.ac.uk/n.r.brook/info.php


    一些猜测。。。

    做一些挖掘,看看脚本接收到的标题,我想我可能已经确定了问题所在。
    使用uploadify时需要发送会话id,因为flash在使用FileReference.upload()时不发送cookies(我想!)方法。但是,在负载平衡环境(如远程服务器)中,除了会话id之外,还有BALANCEID cookie,它确定用户当前使用的服务器。Flash不发送这个cookie,所以负载平衡器有时会将请求发送到另一个服务器,而在这个服务器上会话不存在。

    所以,如果以上都是真的,那么我的问题是我该怎么做才能让flash通过上传来发送这些数据,这样负载均衡器就知道该使用哪台服务器了?或者这是一个失败的事业?


    经过进一步研究,我发现了以下帖子- http://swfupload.org/forum/generaldiscussion/977
    这表明无法使用FileReference.upload()发送Cookie,因此,如果要使用会话数据,uploadify不能与负载平衡服务器一起使用。不过,我想我现在将尝试一种解决方案,将链接到会话id的数据保存到一个文件中。uploadify接收脚本可以打开此文件并提取所需的数据。
    这是我第一次使用任何基于Flash的东西,它并没有改善我对这项技术的看法!

    2 回复  |  直到 4 年前
        1
  •  0
  •   Nick    14 年前

    在“上传”页面中:

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

    在加载uploadify的javascript中:

     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\文件夹中有index.html以防止文件列出。

        2
  •  0
  •   Juggernogger93    13 年前

    有一种方法可以在从flash发送时使用cookies。 要在php中获取会话,不能通过键入$\u session['name']来完成,但您可以创建自己的会话库。这将使php获得所有nassery值,您可以继续。

    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");
    
    推荐文章