19

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

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

如果我尝试在 php 中:

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

我无法在另一个文件中访问它。我有 session_start(); 激活有什么解决办法吗?

4

11 回答 11

11

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

于 2009-12-18T17:09:41.413 回答
8

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

$_COOKIE['PHPSESSID'] = $_POST['PHPSESSID'];
session_start();
于 2009-08-16T16:38:19.703 回答
7

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

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

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

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

于 2010-01-14T08:25:18.077 回答
6

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

于 2010-01-17T22:52:03.117 回答
3

我目前在 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

于 2009-10-20T05:03:50.030 回答
3

在带有 uploadify 实现的外部 .js 文件之前添加它。

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

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

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

PHP 上传脚本需要这个。

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

全部完成!

于 2010-05-27T11:40:31.970 回答
2

在阅读了有关安全性和方法的所有出色回复之后,我已经以自己的方式解决了该问题,并将其发布在此处以供他人使用。跳到底部寻找解决方案,重要的是吗?;)。

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

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

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

解决方案...

不要单独使用默认的 session_start(),它不能被 ID 引用。相反,每次您使用 session_start() 时,为您希望使用的会话设置一个 ID,(我现在认为这是一个很好的做法)。

每次您希望开始会话

session_id("IDHere");

session_start();

重要提示:为每个用户设置一个唯一的会话。

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

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

但是,如果一个插件碰巧在同一个会话中使用了与您相同的会话变量,问题可能会出现,因此最好还是使用它自己的唯一 ID 来创建会话。

于 2012-04-06T12:01:57.043 回答
1

put a label hide in the document with id = "id_usuario_logueado" and value $_SESSION[id]

just write the following code in the jQuery statement:

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

later in php

$id_usuario = $_POST['id_usuario'];

于 2011-12-15T23:18:33.590 回答
0

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

然后,从上面的代码更改'脚本':'/admin/uploads/artistsphotos',到'脚本':'/admin/uploads-unprotected/artistsphotos/id=< ?php echo md5($theUserSessionId); ?>',

然后在您的后端脚本中简单地检查传递的 id 并使用不同的策略验证上传请求。

于 2010-11-10T21:13:39.413 回答
0

这是直接来自uploadify的答案:Using Sessions with Uploadify

在你.php调用ajax的地方:

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

在您的uploadify.php(接收/保存程序)中

$session_name = session_name();

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

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

于 2016-12-19T02:44:46.290 回答
-3
$(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";

}

?>
于 2010-07-13T11:49:03.290 回答