我是在使用上传,并且无法在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();激活了任何解决方案?

有帮助吗?

解决方案

通常,会话ID不会从帖子中读取。您可以这样做:

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

其他提示

您无法解决此问题,因为上载具有Flash Player创建的会话ID。换句话说,Flash Player作为新用户访问上传脚本并获得新的会话。解决此问题的唯一方法是通过帖子传递当前页面session_id到上传脚本。

我找到了一个更容易实现的解决方案,尤其是如果您已经有面向会话的PHP后端进行登录等。

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

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

它将神奇地附上您当前的会话名和会话ID。

这可能起作用,但从安全角度来看确实是不好的做法。这将使有效sessionID的任何人仅通过更改sessionID来模仿该会话。最好将SessionID的基本同步加密使用秘密键(仅在后端代码中知道),然后在upload.php脚本上解密。

我目前在上传 + PHP会话上也有类似的问题。

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

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

(session_id设置:var session_id ='';)

因此,这让我可以检查是的,我的页面的会话ID和上传脚本的会话ID实际上是相同的。

但是,当脚本运行时,我通过:

session_id($ session_id); session_start();

某种程度上,所有会话数据都被破坏了(我还将会话数据设置为一个数组,以便我可以刷新并观察每个请求随着每个请求的增长,然后当我使用上传时,它被擦拭了)。

我不知道如何调试此问题:/

编辑:Suhosin可能正在破坏会议:

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

将其添加到您的外部.js文件之前,请使用上传实现。

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

然后将其添加到上传脚本中。

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

PHP上传脚本需要此。

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

全部完成!

在阅读了有关安全性和方法的所有出色答复之后,我已经解决了问题,我将在此处将其发布在此处,以使其他人的利益。跳到底部以获取解决方案,这很重要吗? ;)。

上传使用其自己的默认会话...

这是一个烦恼,这意味着在访问uploadify.php时,您以前存储的任何会话变量无法从当前(uploadify)会话中访问。实际上,您正在查看与您进行的会话完全无关的会话对象。 aaah,那我们该怎么办,通过JavaScript?

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

解决方案...

请勿单独使用默认的session_start(),而afaik不能由ID引用。相反,每次您使用session_start()时,请为要使用的会话设置ID(我现在认为这是好的练习)。

每次您希望开始一次会话

session_id(“ idhere”);

session_start();

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

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

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

但是,如果一个插件恰好在同一会话中使用相同的会话变量,那么问题可能会出现,因此最好无论如何都可以使用其自己的独特ID进行会话。

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

只需在 jQuery 陈述:

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

后来在PHP中

$id_usuario = $_POST['id_usuario'];

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

然后,从上面的代码更改“脚本”:“/admin/uploads/artistsphotos',到'script':'/admin/uploads-unprotected/artistsphotos/id = <? ?>',

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

这是直接来自上传的答案: 使用上传的会话

在你的 .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,它的工作方式就像会话变量的魅力。

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

}

?>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top