Sessões e uploadify
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?
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:
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";
}
?>