1

ローカル開発サーバーとリモートWebサーバーの両方でPHPバージョン5.3.2を使用しています。

uploadifyを使用していくつかのファイルをサーバーにアップロードしようとしています。受信スクリプトでは、セッションに保存されているデータを使用したいのですが、uploadifyはフラッシュを使用してファイルをスクリプトに送信するため、セッションCookieを送信しません。
この問題の回避策は、uploadifyを取得してセッションIDをスクリプトに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のようなもので、上記のように透過的なセッションIDを使用し、session_id($ _ GET ['SESSNAME'])を使用して手動でIDを設定しようとしました。

これは、ブラウザで直接スクリプトにアクセスし、セッションCookieを手動で削除した場合でも、現在のセッションIDを送信するときに常に機能します。また、ローカルサーバーのuploadifyでも常に機能します。ただし、リモートサーバーでuploadifyを使用すると、約20%の時間、完全にランダムに機能します。パターンはありません。追加すると、より頻繁に動作するように見えました

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

スクリプトに、しかし、これは単なる偶然の一致だったかもしれません。

ローカルサーバー情報:http
://www.dur.ac.uk/nrbrook/info_local.php リモートサーバー情報:http ://www.dur.ac.uk/nrbrook/info.php


いくつかの憶測...

スクリプトが受け取っているヘッダーを掘り下げて見てみると、問題が特定された可能性があります。
FileReference.upload()(私は思う!)メソッドを使用する場合、フラッシュはCookieを送信しないため、uploadifyを使用する場合はセッションIDを送信する必要があります。ただし、セッションIDだけでなく、負荷分散された環境(リモートサーバーなど)には、ユーザーが現在使用しているサーバーを決定するBALANCEIDCookieもあります。FlashはこのCookieを送信しないため、ロードバランサーがリクエストを別のサーバーに送信することがあり、このサーバーにはセッションが存在しません。

セッションを出力した後、セッション変数を設定して、この動作をテストしました。これを実行してファイルを繰り返し送信すると、問題が発生します。最初は空の配列が表示されますが、変数にいくつかの繰り返しが表示され始めます。

したがって、上記がすべて当てはまる場合、私の質問は、アップロードでこのデータを送信するためにフラッシュを取得して、ロードバランサーが使用するサーバーを認識できるようにするために何ができるかということです。それともこれは失われた原因ですか?


答え?

さらに調査した結果、次の投稿が見つかりました-http: //swfupload.org/forum/generaldiscussion/977
これは、FileReference.upload()でCookieを送信する方法がないため、負荷分散されたサーバーでuploadifyを使用できないことを示しています。セッションデータを使用したい。ただし、セッションIDにリンクされたデータをファイルに保存するソリューションを試してみようと思います。uploadify受信スクリプトは、このファイルを開いて、必要なデータを引き出すことができます。
これは、Flashベースのものを使った初めての経験ですが、テクノロジーに対する私の意見は改善されていません。

4

2 に答える 2

0

この問題に対する私の解決策は次のとおりです。

「アップロード」ページ:

 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_folderにindex.htmlがあることを確認してください。

于 2010-07-31T15:36:56.553 に答える
0

フラッシュから送信するときにCookieを使用する方法があります。phpがセッションストレージIDを見つけるにはCookieが必要です。Cookieに保存される値は、実際のセッションIDであり、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");
于 2011-09-01T17:15:57.303 に答える