【问题标题】:Sessions and uploadify会话和上传
【发布时间】:2010-11-20 01:23:24
【问题描述】:

我正在使用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();活性 有什么解决办法吗?

【问题讨论】:

  • 会话 ID 是如何携带的?
  • 我有 session_start();在我的引导程序上,它包含在我的所有文件中,但是我有基于登录的页面,它们工作得很好,但是uploadify 使用了一个特殊的用户代理,所以这就是为什么我需要设置 {'PHPSESSID' : '= session_id( ); ?>'}

标签: php jquery session uploadify


【解决方案1】:

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

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

【讨论】:

  • 因此,如果我回显我设置它的会话 /admin/uploads/artistsphotos 它就可以工作!但如果我尝试在我需要的地方回显会话,这里:/admin/uploads/artistsphotosupload 不起作用!,我什至无法设置 const。
  • @Greg - 设置 cookie 变量以实际引用原始会话的作用是什么?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          在带有 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();
          

          全部完成!

          【讨论】:

          • 在页面上打印会话 ID 可能缺乏安全性?
          • @Wallysson 只是好奇为什么它缺乏安全性?任何试图获取会话 ID 的人都可以从 cookie 中获取它们,那么这有什么区别呢?
          【解决方案7】:
          $(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";
          
          }
          
          ?>
          

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              【解决方案9】:

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

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

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

              稍后在 php 中

              $id_usuario = $_POST['id_usuario'];

              【讨论】:

                【解决方案10】:

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

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

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

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

                解决方案...

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

                您希望每次都开始一个会话

                session_id("IDHere");

                session_start();

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

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

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

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

                【讨论】:

                • 在 session_id() 之前执行 session_write_close()
                【解决方案11】:

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

                在您调用 ajax 的 .php 中:

                '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,它对会话变量很有吸引力。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-12-23
                  • 2013-01-04
                  • 1970-01-01
                  • 2011-11-28
                  • 2012-07-01
                  • 2012-06-24
                  • 2015-05-30
                  相关资源
                  最近更新 更多