Pergunta

Eu estou usando o uploadify, e eu não posso conjunto de sessões em meus arquivos php, meu script parecido com este:

    $("#uploadify").uploadify({
        'uploader'       : '/extra/flash/uploadify.swf',
        'script'         : '/admin/uploads/artistsphotos',
        'scriptData'     : {'PHPSESSID' : '<?= session_id(); ?>'},
        'cancelImg'      : '/images/cancel.png',
        'folder'         : '/img/artists',
        'queueID'        : 'fileQueue',
        'auto'           : false,
        'multi'          : true,
        'onComplete'     : function(a, b, c, d, e){

        },  
        'onAllComplete': function(event,data){
            $bla = $('#art').find(':selected',this);
            $fi  = $bla.val();
             $.ajax({
               type: "POST",
               url: "/admin/uploads/artistsphotosupload",
               data: "artist="+$fi,
               success: function(msg){
                 console.log(msg);
               }
             });
     }
});

E em php se eu tentar:

$_SESSION['name'] = 'something';

Eu não consigo acessá-lo em outro arquivo.e eu tenho session_start();ativado Todas as soluções?

Foi útil?

Solução

Normalmente, o ID da sessão não será lido na postagem. Você poderia fazer isso:

$_COOKIE['PHPSESSID'] = $_POST['PHPSESSID'];
session_start();

Outras dicas

Você não pode resolver isso porque o Uploady possui um ID de sessão próprio criado pelo Flash Player. Em outras palavras, o Flash Player acessa o script de upload como um novo usuário e recebe uma nova sessão. A única maneira de resolver isso é passar na página atual session_id por meio de postagem para o script de upload.

Encontrei uma solução que é muito mais fácil de implementar, especialmente se você já possui um back-end de PHP orientado a sessão para login, etc.:

Basta escrever o código a seguir na declaração jQuery:

'script'    : '/upload.php?<?= session_name(); ?>=<?= session_id(); ?>',

que anexará magicamente o nome da sessão atual e o ID da sessão.

Isso pode funcionar, mas de uma perspectiva de segurança é uma prática muito ruim. Isso permitiria que qualquer pessoa com um SessionID válido se veste essa sessão apenas alterando o SessionID. Seria melhor fazer até uma criptografia síncrona básica do SessionID com uma chave secreta (conhecida apenas pelo código de back -end) e depois descriptografá -la no script upload.php.

Atualmente, estou tendo um problema semelhante com o Uploadify + PHP Sessions.

Usando error_log (), posso monitorar que, quando o aplicativo Flash do Uploady envia os dados do arquivo para o servidor, ele passa a session_id correta para o script de upload:

'scriptdata': {'session_id': session_id},

(session_id definido anteriormente: var session_id = '';)

Então, isso me permite verificar se sim, o ID da sessão para minhas páginas e o ID da sessão para o script de uploads são de fato o mesmo.

Mas, quando o script é executado e eu inicio a sessão por:

session_id ($ session_id); session_start ();

De alguma forma, todos os dados da sessão são destruídos (eu também instalei os dados da sessão em uma matriz para que eu possa atualizar e assistir os dados crescerem com cada solicitação; depois, quando uso o upload, é limpo).

Não tenho idéia de como depurar isso:/

Edit: Suhosin pode estar destruindo a sessão:

http://www.uploadify.com/forum/viewtopic.php?f=7&t=2062

Adicione isso antes do seu arquivo .js externo com a implementação do upload.

<!-- Get sesssionId -->
 <script type="text/javascript" charset="utf-8">
  var sessionId = "<?php echo session_id(); ?>";
 </script>

Em seguida, adicione isso ao script de upload.

$('#uploadify').uploadifySettings('scriptData', {'sessionId': sessionId});

O script de upload do PHP precisa disso.

// Start session
 session_id($_POST['sessionId']);
 session_start();

Tudo feito!

Depois de ler todas as brilhante respostas a respeito de segurança e método, eu trabalhei a minha própria maneira de contornar o problema, e eu vou postar ele aqui para o benefício dos outros.Pular para o fundo para a solução, é tudo o que importa, certo?;).

Uploadify utiliza a própria sessão padrão...

Este é um aborrecimento que significa que ao acessar uploadify.php, quaisquer variáveis de sessão que você tinha anteriormente armazenado não pode ser acessado a partir do atual (uploadify de sessão).Você é, essencialmente, olhando para um objeto de sessão que é completamente não relacionados para a sessão que você fez.Aaah, então, o que fazemos, passe-a através do javascript?

Você "pode" passar uma referência para a sessão através de javascript javascript é cliente (usuário) de um lado, e, por isso, um usuário pode alterar a sessão antes de referência é enviado para o servidor.Ele poderia efetivamente falso o seu ID de sessão.Este, na verdade, é terrivelmente perigoso, pelo menos no caso da minha aplicação.

A solução...

NÃO use o padrão session_start() sobre ele próprio, que AFAIK não pode ser referenciado por um ID.Em vez disso, cada vez que você usar o session_start(), defina um ID de sessão que você deseja usar (o que eu sinto agora é uma boa prática, independentemente).

CADA VEZ que você deseja iniciar uma sessão

session_id("IDHere");

session_start();

IMPORTANTE:A definição de uma sessão exclusiva para cada usuário.

As sessões são variáveis compartilhadas entre o servidor e cada cliente que se conecta com irresponsabilidade.Se você deseja armazenar variáveis de sessão que são únicas para cada usuário do seu site, a session_id TEM que ser algum tipo de completamente únicos e dinâmicos, de IDENTIFICAÇÃO em relação ao usuário.Isso pode ser acessada a partir de um cookie, ou, de forma mais segura de um banco de dados (exclusivo do usuário ID?).

Editar:Após um pouco de pesquisa, parece que o padrão de sessões (sem IDENTIFICAÇÃO) utilizar o identificador de sessão "PHPSESSID".Assim, embora eu não tentei ainda, a definição de session_id("P"), antes de iniciar a sessão em uploadify.php pode corrigir o problema.

Mas, ainda assim, se um plugin que só acontece para usar um idêntico variável de sessão para dentro de você mesma sessão, problemas podem surgir, por isso é provavelmente melhor para fazer a sua sessão com o seu ID exclusivo de qualquer maneira.

Coloque um rótulo de esconder no documento com id = "id_usuario_logueado" and value $_SESSION[id]

Basta escrever o seguinte código no jQuery declaração:

'scriptData': {'id_usuario':$('#id_usuario_logueado').text()},

posteriormente no PHP

$id_usuario = $_POST['id_usuario'];

Encontrei a solução, se o seu script de back -end precisar de autenticação e redirecionar, você terá o problema 302 - basta criar um novo controlador ou script que não precisa de autenticação.

Então, do código acima, altere 'script': '/admin/uploads/artistsphotos', para 'script': '/admin/uploads-unprotected/artistsphotos/id = <? Php eco md5 ($ theUserSessionID); ?> ',

Em seguida, no seu script de back -end, basta verificar o ID que foi aprovado e autenticar a solicitação de upload com uma estratégia diferente.

Aqui está a resposta diretamente do uploadify: Usando Sessões com Uploadify

Em seu .php que chama os ajax:

'scriptData': {'<?php echo session_name();?>':'<?php echo session_id();?>'},

E na sua uploadify.php (receber/programa de economia)

$session_name = session_name();

if (!isset($_GET[$session_name])) {
    exit;
} else {
    session_id($_GET[$session_name]);
    session_start();
}

Eu estou usando 2.1.4, e ele funciona como um encanto para variáveis de sessão.

$(document).ready(function() {



nombre = $('#uploadify1').val(); //first input

autor = $('#uploadify1').val();   // second one



$("#uploadify").uploadify({

    'uploader'       : UPLOADIFY_URL+'scripts/uploadify.swf',

    'script'         : 'ticket_docs_uploadify.php',

    'cancelImg'      : UPLOADIFY_URL+'cancel.png',

    'folder'         : 'ticket_document_uploads',

    'queueID'        : 'fileQueue',

    'checkScript'    : 'ticket_docs_check.php?nombre='+nombre+'&autor='+autor,

    'fileDesc'       : 'I am testing uploadify',

    'buttonText'     : 'Upload',

    'scriptData'     : {'sessTempTickedId': '<?php echo $_SESSION['sessTempTickedId'];?>', 'pkEmployeeID': '<?php echo $_SESSION['pkEmployeeID'];?>', 'EmployeeDepartment': '<?php echo $_SESSION['EmployeeDepartment'];?>' },

    'auto'           : false,

    'multi'          : true,        

    'onComplete'     : function(a, b, c, d, e){

        //alert(a+b+c+d+e);

    },

    'onAllComplete': function(event,data){

        //something here             alert('asdasd');             alert(json_decode(data));            

    }

});

});



<?php include_once('../../common/inc/connectdb.inc.php');

if (!empty($_FILES))

{

$tempFile = $_FILES['Filedata']['tmp_name'];

$targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/';

//change the file name here



$fileName = time();



$arrFile = pathinfo($_FILES['Filedata']['name']);



$strFileExt = strtolower($arrFile['extension']);



$strFileName = $arrFile['filename'];



$strFileBaseName = $arrFile['basename'];



$fileName = $fileName.'.'.$strFileExt;



$targetFile = str_replace('//','/',$targetPath) . $fileName;



$sql = "INSERT INTO ticket_documents (fkTicketID,fkEmployeeID,fkDepartmentID,TicketDocumentName,TicketDocumentLabel) VALUES ('".$_POST['sessTempTickedId']."','".$_POST['pkEmployeeID']."','".$_POST['EmployeeDepartment']."','".$fileName."','".$_FILES['Filedata']['name']."')";

mysql_query($sql) or die(mysql_error());



move_uploaded_file($tempFile,$targetFile);

echo "1";

}

?>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top