Php 会话和上传

Php 会话和上传,php,jquery,session,uploadify,Php,Jquery,Session,Uploadify,我正在使用uploadify,无法在php文件中设置会话,我的脚本如下所示: $("#uploadify").uploadify({ 'uploader' : '/extra/flash/uploadify.swf', 'script' : '/admin/uploads/artistsphotos', 'scriptData' : {'PHPSESSID' : '<?= session_id();

我正在使用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);
               }
             });
     }
});
我无法在另一个文件中访问它。我有session_start();激活
有什么解决方案吗?

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

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

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

使用error_log()我可以监控uploadify flash应用程序将文件数据发送到服务器时,是否会将正确的会话id传递给上载脚本:

'scriptData':{'session_id':session_id}

(先前设置的会话\u id:var会话\u id=“”;)

这样,我就可以检查页面的会话id和uploadify脚本的会话id是否相同

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

会话id($会话id); 会话_start()

不知何故,所有会话数据都被销毁了(我还将会话数据设置到一个数组中,这样我就可以刷新并观察数据随着每个请求而增长,然后当我使用uploadify时,它被擦除了)

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

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


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

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

$('#uploadify').uploadifySettings('scriptData', {'sessionId': sessionId});
只需在jQuery语句中编写以下代码:

'script'    : '/upload.php?<?= session_name(); ?>=<?= session_id(); ?>',
'scriptData': {'id_usuario':$('#id_usuario_logueado').text()},
'script':'/upload.php?=',

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

这可能会起作用,但从安全角度看,这是一种非常糟糕的做法。这将允许任何具有有效sessionID的人只需更改sessionID即可模拟该会话。最好使用一个密钥(只有后端代码知道)对sessionid进行基本的同步加密,然后在upload.php脚本上对其进行解密。

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

<!-- Get sesssionId -->
 <script type="text/javascript" charset="utf-8">
  var sessionId = "<?php echo session_id(); ?>";
 </script>
PHP上传脚本需要这个

// Start session
 session_id($_POST['sessionId']);
 session_start();
全部完成

$(文档).ready(函数(){
$(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";

}

?>
nombre=$('#uploadify1').val();//第一次输入 autor=$('#uploadify1').val();//第二个 $(“#上传”)。上传({ “uploader”:UPLOADIFY_URL+“scripts/UPLOADIFY.swf”, “script”:“ticket\u docs\u uploadify.php”, 'cancelImg':UPLOADIFY_URL+'cancel.png', '文件夹':'票据\文件\上传', 'queueID':'fileQueue', 'checkScript':'ticket\u docs\u check.php?nombre='+nombre+'&autor='+autor, 'fileDesc':'I'm testing uploadify', 'buttonText':'Upload', 'scriptData':{'sessTempTickedId':'','pkEmployeeID':'','EmployeeDepartment':'''}, “自动”:false, "多":对,, “onComplete”:函数(a、b、c、d、e){ //警报(a+b+c+d+e); }, “onAllComplete”:函数(事件、数据){ //这里的东西警报('asdasd');警报(json_解码(数据)); } }); });
我找到了解决方案,如果您的后端脚本需要身份验证和重定向,您将遇到302问题-只需创建一个不需要身份验证的新控制器或脚本

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


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

在文档中隐藏一个标签,并使用
id=“id\u usuario\u logueado”和值$\u SESSION[id]

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

'script'    : '/upload.php?<?= session_name(); ?>=<?= session_id(); ?>',
'scriptData': {'id_usuario':$('#id_usuario_logueado').text()},
稍后使用php


$id\u usuario=$\u POST['id\u usuario']

在阅读了所有关于安全性和方法的精彩回复后,我已经用自己的方法解决了这个问题,为了其他人的利益,我将把它发布在这里。跳到底部寻找解决方案,这才是最重要的,对吗?;)

Uploadify使用自己的默认会话。。。 这是一个麻烦,这意味着当访问uploadify.php时,您以前存储的任何会话变量都无法从当前(uploadify)会话访问。实际上,您看到的是一个与您所做的会话完全无关的会话对象。啊,那么我们该怎么做,通过javascript传递它

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

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

每次您希望启动会话时 会话id(“IDHere”)

会话_start()

重要提示:为每个用户设置唯一的会话。 会话是服务器和其他任意连接的客户端之间共享的变量。如果您想存储对站点的每个单独用户唯一的会话变量,会话id必须是相对于该用户的某种完全唯一的动态id。这可以从cookie访问,或者更安全地从数据库(用户的唯一ID?)访问

编辑:经过一点研究,似乎默认会话(没有ID)使用sessionID“PHPSESSID”。所以,虽然我还没有尝试过,但在开始之前设置session_id(“PHPSESSID”)
$session_name = session_name();

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