我正在使用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();活性 任何解决方案?
答案 0 :(得分:11)
你无法解决这个问题,因为uploadify有自己的会话ID,由flash player创建。换句话说,Flash播放器以新用户的身份访问uploadify脚本并获得新会话。解决此问题的唯一方法是将当前页面session_id通过post传递给uploadify脚本。
答案 1 :(得分:8)
通常不会从POST读取会话ID。 你可以这样做:
$_COOKIE['PHPSESSID'] = $_POST['PHPSESSID'];
session_start();
答案 2 :(得分:7)
我找到了一个更容易实现的解决方案,特别是如果你已经有一个面向会话的PHP后端用于登录等等:
只需在jQuery语句中编写以下代码:
'script' : '/upload.php?<?= session_name(); ?>=<?= session_id(); ?>',
将神奇地附加您当前的会话名称和会话ID。
答案 3 :(得分:6)
这可能有用但从安全角度来看确实是不好的做法。这将允许具有有效sessionID的任何人仅通过更改sessionid来模拟该会话。最好使用密钥(只有后端代码知道)对sessionid进行基本的同步加密,然后在upload.php脚本中对其进行解密。
答案 4 :(得分: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可能正在破坏会话:
答案 5 :(得分: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();
全部完成!
答案 6 :(得分:2)
在阅读了关于安全性和方法的所有精彩回复之后,我已经自己解决了这个问题,我会在这里发布它以造福他人。跳到底部寻找解决方案,这一切都很重要吗? ;)
这是一个烦恼,这意味着在访问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进行会话。
答案 7 :(得分:1)
使用id = "id_usuario_logueado" and value $_SESSION[id]
只需在jQuery
语句中编写以下代码:
'scriptData': {'id_usuario':$('#id_usuario_logueado').text()},
稍后在php
$id_usuario = $_POST['id_usuario'];
答案 8 :(得分:0)
我找到了解决方案,如果您的后端脚本需要身份验证并重定向,您将遇到302问题 - 只需创建一个不需要身份验证的新控制器或脚本。
然后,从上面的代码改变 'script':'/ admin / uploads / artistsphotos', 至 'script':'/ admin / uploads-unprotected / artistsphotos / id =&lt; ?php echo md5($ theUserSessionId); ?&GT;”,
然后在您的后端脚本中,只需检查传递的ID,并使用其他策略验证上传请求。
答案 9 :(得分:0)
以下是来自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,它就像会话变量的魅力一样。
答案 10 :(得分:-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";
}
?>