php jquery session uploadify

php - Sesiones y subir



jquery session (11)

Actualmente estoy teniendo un problema similar con las sesiones de uploadify + PHP.

Al utilizar error_log (), puedo supervisar que cuando la aplicación de carga uploadify envía los datos del archivo al servidor, pasa el id. De sesión correcto al script de carga:

''scriptData'': {''session_id'': session_id},

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

Entonces, eso me permite verificar que sí, el identificador de sesión para mis páginas y el identificador de sesión para el script de uploadify son de hecho el mismo.

Pero, cuando se ejecuta el script y comienzo la sesión por:

session_id ($ session_id); session_start ();

De alguna manera, TODOS los datos de la sesión se destruyen (también he estado configurando los datos de la sesión en una matriz para poder actualizar y ver cómo aumentan los datos con cada solicitud, luego cuando uso uploadify, se borra).

No tengo ni idea de cómo depurar esto: /

Edición: suhosin puede estar destruyendo la sesión:

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

Estoy usando uploadify, y no puedo establecer sesiones en mis archivos php, mi script se parece a esto:

$("#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); } }); } });

Y en php si lo intento:

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

No puedo acceder a él en otro archivo. Y tengo session_start (); activado ¿Alguna solución?


Agregue esto antes de su archivo .js externo con la implementación uploadify.

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

Luego agregue esto al script uploadify.

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

PHP script de carga necesita esto.

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

¡Todo listo!


Aquí está la respuesta directamente desde uploadify: Uso de sesiones con Uploadify

En tu .php que llama al ajax:

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

Y en tu uploadify.php (programa de recepción / guardado)

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

Estoy usando 2.1.4, y funciona como un encanto para las variables de sesión.


Después de leer todas las respuestas brillantes con respecto a la seguridad y el método, he resuelto el problema y lo publico aquí para beneficio de los demás. Pase a la parte inferior de la solución, es todo lo que importa ¿verdad? ;).

Uploadify usa su propia sesión por defecto ...

Esta es una molestia que significa que al acceder a uploadify.php, no se puede acceder a ninguna de las variables de sesión que haya almacenado anteriormente desde la sesión actual (uploadify). Básicamente, está mirando un objeto de sesión que no tiene relación alguna con la sesión que realizó. Aaah, entonces, ¿qué hacemos, pasarlo a través de javascript?

Usted puede "pasar" una referencia a la sesión a través de javascript, pero javascript es del lado del cliente (usuario), y debido a esto, un usuario puede cambiar la referencia de la sesión antes de enviarla al servidor. Él podría efectivamente falsificar su ID de sesión. Esto es realmente aterradoramente peligroso, al menos en el caso de mi solicitud.

La solución...

NO use el session_start () predeterminado por sí mismo, ya que no se puede hacer referencia a AFAIK mediante una ID. En su lugar, cada vez que use session_start (), establezca un ID para la sesión que desea usar (lo que ahora considero que es una buena práctica, independientemente).

Cada vez que desee iniciar una sesión

session_id ("IDHere");

session_start ();

IMPORTANTE: Establecer una sesión única para cada usuario.

Las sesiones son variables compartidas entre el servidor y todos los demás clientes que se conectan con el abandono imprudente. Si desea almacenar variables de sesión que son únicas para cada usuario individual de su sitio, el session_id TIENE que ser un tipo de ID dinámico completamente único en relación con ese usuario. Se puede acceder a este desde una cookie, o de forma más segura a una base de datos (¿el ID exclusivo del usuario?).

Edición: después de un poco de investigación, parece que las sesiones predeterminadas (sin una ID) usan el ID de sesión "PHPSESSID". Entonces, aunque todavía no lo he probado, configurar session_id ("PHPSESSID"), antes de iniciar la sesión en uploadify.php también puede solucionar el problema.

Pero aún así, si un complemento usa una variable de sesión idéntica a la de usted dentro de la misma sesión, podrían surgir problemas, por lo que probablemente sea mejor hacer su sesión con su propia ID única de todos modos.


Encontré la solución, si su secuencia de comandos de back-end necesita autenticación y redirige, obtendrá el problema 302: simplemente cree un nuevo controlador o secuencia de comandos que no necesite autenticación.

Luego, desde el código anterior, cambie ''script'': ''/ admin / uploads / artistsphotos'', To ''script'': ''/ admin / uploads desprotected / artistsphotos / id = <? Php echo md5 ($ theUserSessionId); ?> '',

Luego, en su secuencia de comandos de back-end, simplemente verifique el ID que se pasó y autentique la solicitud de carga con una estrategia diferente.


Encontré una solución que es mucho más fácil de implementar, especialmente si ya tiene un backend PHP orientado a la sesión para iniciar sesión, etc.

simplemente escriba el siguiente código en la declaración jQuery:

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

lo que mágicamente adjuntará su nombre de sesión actual y su ID de sesión.


Esto puede funcionar pero desde una perspectiva de seguridad es realmente una mala práctica. Esto permitiría que cualquier persona con un ID de sesión válido suplante esa sesión simplemente cambiando el ID de sesión. Sería mejor hacer incluso un cifrado síncrono básico del sessionid con una clave secreta (conocida solo por el código de back-end), y luego descifrarlo en el script upload.php.


Por lo general, la ID de sesión no se leerá desde POST. Podrías hacer esto:

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


no puede resolver esto porque uploadify tiene su propia ID de sesión que se crea con flash player. En otras palabras, el reproductor flash accede al script uploadify como nuevo usuario y obtiene una nueva sesión. La única forma en que puede resolver esto es pasar la página actual session_id a través de la publicación al script uploadify.


ponga una etiqueta en el documento con id = "id_usuario_logueado" and value $_SESSION[id]

simplemente escriba el siguiente código en la declaración jQuery :

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

mas tarde en php

$id_usuario = $_POST[''id_usuario''];


$(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"; } ?>