会话和uploadify

我正在使用uploadify,我无法在我的php文件中设置会话,我的脚本如下所示:

$("#uploadify").uploadify({ 'uploader' : '/extra/flash/uploadify.swf', 'script' : '/admin/uploads/artistsphotos', 'scriptData' : {'PHPSESSID' : ''}, '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); } }); } }); 

在PHP中如果我尝试:

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

我无法在另一个文件中访问它。我有session_start(); 激活任何解决方案

通常,不会从POST读取会话ID。 你可以这样做:

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

你无法解决这个问题,因为uploadify有自己的会话ID,由flash播放器创建。 换句话说,Flash播放器以新用户的身份访问uploadify脚本并获得新会话。 解决此问题的唯一方法是将当前页面session_id通过post传递给uploadify脚本。

我找到了一个更容易实现的解决方案,特别是如果你已经有一个面向会话的PHP后端用于登录等等:

只需在jQuery语句中编写以下代码:

 'script' : '/upload.php?=', 

这将神奇地附加您当前的会话名称和您的会话ID。

这可能有用但从安全角度来看确实是不好的做法。 这将允许具有有效sessionID的任何人仅通过更改sessionid来模拟该会话。 最好使用密钥(仅在后端代码中知道)对sessionid进行基本同步加密,然后在upload.php脚本上对其进行解密。

我目前在uploadify + PHP会话上遇到了类似的问题。

使用error_log()我可以监控当uploadify Flash应用程序将文件数据发送到服务器时,它会将正确的session_id传递给上传脚本:

‘scriptData’:{‘session_id’:session_id},

(之前设置的session_id:var session_id =”;)

所以,这让我检查是,我的页面的会话ID和uploadify脚本的会话ID实际上是相同的。

但是,当脚本运行时,我通过以下方式启动会话:

SESSION_ID($ SESSION_ID); 在session_start();

不知怎的,所有的会话数据都被销毁了(我还将会话数据设置为一个数组,这样我就可以刷新并观察每个请求的数据增长情况,然后当我使用uploadify时,它就会被擦除)。

我不知道如何调试这个:/

编辑:suhosin可能正在破坏会话:

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

使用uploadify实现在外部.js文件之前添加此项。

   

然后将其添加到uploadify脚本中。

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

PHP上传脚本需要这个。

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

全部完成!

在阅读了关于安全性和方法的所有精彩回复之后,我已经自己解决了这个问题,我会在这里发布它以造福他人。 跳到底部寻找解决方案,这一切都很重要吗? )。

Uploadify使用它自己的默认会话…

这是一个烦恼,这意味着当访问uploadify.php时,无法从当前(uploadify)会话访问您先前存储的任何会话变量。 您实际上是在查看与您所创建的会话完全无关的会话对象。 Aaah,那么我们做什么,通过javascript传递它?

您可以“通过javascript”传递对会话的引用,但javascript是客户端(用户)端,因此,用户可以在将会话引用发送到服务器之前更改它。 他可以有效地伪造他的会话ID。 这实际上是非常危险的,至少在我申请的情况下。

解决方案…

不要使用它自己的默认session_start(),ID不能引用AFAIK。 相反,每次使用session_start()时,都要为要使用的会话设置一个ID(我现在认为这是一种很好的做法)。

每个单独的时间你想开始一个会议

SESSION_ID( “IDHere”);

在session_start();

重要信息:为每个用户设置唯一会话。

会话是服务器和连接鲁莽放弃的每个其他客户端之间共享的变量。 如果要存储对站点的每个用户唯一的会话变量,则session_id必须是某种与该用户相关的完全唯一的动态ID。 这可以从cookie访问,或者更安全地访问数据库(用户的唯一ID?)。

编辑:经过一些研究,似乎默认会话(没有ID)使用sessionID“PHPSESSID”。 所以虽然我还没有尝试过,但是在uploadify.php中启动会话之前设置session_id(“PHPSESSID”)也可以解决问题。

但是,如果一个插件碰巧在同一个会话中使用了相同的会话变量,那么问题可能会出现,所以最好还是使用它自己的唯一ID进行会话。

将标签隐藏在id = "id_usuario_logueado" and value $_SESSION[id]的文档中, id = "id_usuario_logueado" and value $_SESSION[id]

只需在jQuery语句中编写以下代码:

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

后来在php

$id_usuario = $_POST['id_usuario'];

我找到了解决方案,如果您的后端脚本需要身份validation和重定向,您将遇到302问题 – 只需创建一个不需要身份validation的新控制器或脚本。

然后,从上面的代码更改’script’:’/ admin / uploads / artistsphotos’,To’script’:’/ admin / uploads-unprotected / artistsphotos / id = <?php echo md5($ theUserSessionId); ?>”,

然后在您的后端脚本中,只需检查传递的ID,并使用不同的策略validation上载请求。

以下是直接来自uploadify的答案: 在Uploadify中使用Sessions

在调用ajax的.php中:

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

并在您的uploadify.php (接收/保存计划)

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

我使用的是2.1.4,它就像会话变量的魅力一样。

 $(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': '', 'pkEmployeeID': '', '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)); } }); });