Я использую 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 (); активированы Любые решения?
Обычно идентификатор сеанса не считывается из POST. Вы можете сделать это:
$_COOKIE['PHPSESSID'] = $_POST['PHPSESSID']; session_start();
вы не можете решить это, потому что uploadify имеет собственный идентификатор сеанса, созданный флеш-плеером. Другими словами, флеш-плеер получает доступ к скрипту добавления в качестве нового пользователя и получает новый сеанс. Единственный способ решить эту проблему – передать текущую страницу session_id через сообщение в скрипт uploadify.
Я нашел решение, которое намного проще реализовать, особенно если у вас уже есть ориентированный на сессию PHP-сервер для входа и т. Д .:
просто напишите следующий код в инструкции jQuery:
'script' : '/upload.php?<?= session_name(); ?>=<?= session_id(); ?>',
который волшебным образом присоединяет ваше текущее имя сеанса и идентификатор сеанса.
Это может сработать, но с точки зрения безопасности это действительно плохая практика. Это позволит любому, у кого есть действительный sessionID, олицетворять этот сеанс, просто изменив sessionid. Было бы лучше сделать даже базовое синхронное шифрование sessionid с секретным ключом (известным только для внутреннего кода), а затем расшифровать его на сценарии upload.php.
В настоящее время у меня есть аналогичная проблема с добавлением + PHP сессий.
Использование error_log () Я могу контролировать, когда приложение uploadify flash отправляет данные файла на сервер, оно передает правильный скрипт session_id в сценарий загрузки:
'scriptData': {'session_id': session_id},
(session_id установлен раньше: var session_id = '';)
Таким образом, это позволяет мне проверить, что да, идентификатор сеанса для моих страниц и идентификатор сеанса для сценария добавления на самом деле то же самое.
Но, когда скрипт запускается, и я запускаю сеанс:
session_id ($ session_id); session_start ();
Как-то ВСЕ данные сеанса уничтожаются (я также устанавливал данные сеанса в массив, чтобы обновлять и наблюдать за ростом данных с каждым запросом, а затем, когда я использую uploadify, он стирается).
Я не знаю, как отладить это: /
edit: suhosin может уничтожить сеанс:
Добавьте это перед вашим внешним .js-файлом с реализацией uploadify.
<!-- 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();
Все сделано!
Прочитав все блестящие ответы, касающиеся безопасности и метода, я по-своему поработал над проблемой, и я отправлю ее здесь для других. Перейти к основанию для решения, это все, что имеет значение? ;).
Это досада, которая означает, что при доступе к uploadify.php любые сеансовые переменные, которые вы ранее сохранили, не могут быть доступны из текущего сеанса (uploadify). Вы в основном смотрите на объект сеанса, который полностью не связан с сеансом, который вы сделали. Ааа, так что мы делаем, передаем его через javascript?
Вы можете «передать» ссылку на сеанс через javascript, но javascript – это клиентская (пользовательская) сторона, и из-за этого пользователь может изменить ссылку на сеанс перед отправкой на сервер. Он мог эффективно подделывать свой идентификатор сеанса. Это на самом деле ужасно опасно, по крайней мере, в случае моей заявки.
НЕ используйте стандартную session_start () по своему усмотрению, на которую AFAIK не может ссылаться на идентификатор. Вместо этого каждый раз, когда вы используете session_start (), задайте ID для сеанса, который вы хотите использовать (что я сейчас считаю хорошей практикой независимо).
session_id ( "IDHere");
session_start ();
Сеансы – это переменные, разделяемые между сервером и каждым другим клиентом, подключающиеся к безрассудным отказам. Если вы хотите хранить переменные сеанса, которые уникальны для каждого отдельного пользователя вашего сайта, session_id должен быть своего рода полностью уникальным динамическим идентификатором относительно этого пользователя. К этому можно получить доступ из файла cookie или более надежно базы данных (уникальный идентификатор пользователя?).
Изменить: после небольшого исследования кажется, что сеансы по умолчанию (без идентификатора) используют sessionID «PHPSESSID». Поэтому, хотя я еще не пробовал, установка session_id («PHPSESSID»), прежде чем вы начнете сеанс в uploadify.php, также может устранить проблему.
Но тем не менее, если плагин просто так использует идентичную переменную сеанса для вас внутри одного сеанса, проблемы могут возникнуть, поэтому, вероятно, лучше всего сделать свою сессию с ее собственным уникальным идентификатором.
поместите ярлык в документ с id = "id_usuario_logueado" and value $_SESSION[id]
просто напишите следующий код в инструкции jQuery
:
'scriptData': {'id_usuario':$('#id_usuario_logueado').text()},
позже в php
$id_usuario = $_POST['id_usuario'];
Я нашел решение, если ваш внутренний скрипт нуждается в аутентификации и перенаправлении, вы получите проблему 302 – просто создайте новый контроллер или скрипт, который не нуждается в аутентификации.
Затем из приведенного выше кода измените 'script': '/ admin / uploads / artsphotos', To 'script': '/ admin / uploads-unprotected / artsphotos / id = <? Php echo md5 ($ theUserSessionId); ?>»,
Затем в вашем сценарии backend просто проверьте переданный идентификатор и аутентифицируйте запрос на загрузку с другой стратегией.
Вот ответ непосредственно из загрузки: Использование сеансов с 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, и он работает как прелесть для переменных сеанса.
$(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"; } ?>