سؤال

أنا أستخدم التحميل، ولا يمكنني تعيين جلسات في ملفات 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 ()؛ تفعيل أي حلول؟

هل كانت مفيدة؟

المحلول

عادة لن يتم قراءة معرف الجلسة من المشاركة. يمكنك القيام بذلك:

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

نصائح أخرى

لا يمكنك حل هذا لأن التحميل يحتوي على معرف جلسة خاصة يتم إنشاؤه بواسطة Flash Player. بمعنى آخر، يقوم Flash Player بالوصول إلى البرنامج النصي للتحميل كمستخدم جديد ويحصل على جلسة جديدة. الطريقة الوحيدة التي يمكنك حلها هي تمرير جلسة الصفحة الحالية من خلال النشر إلى البرنامج النصي للتحميل.

لقد وجدت حلا أسهل بكثير في التنفيذ، خاصة إذا كان لديك بالفعل خطة PHP الموجهة نحو الجلسة المزدوجة لتسجيل الدخول، إلخ.:

ما عليك سوى كتابة التعليمات البرمجية التالية في عبارة JQUERY:

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

والتي سوف نعلق بطريقة سحرية اسم الجلسة الحالية ومعرف الجلسة الخاص بك.

قد يعمل هذا ولكن من منظور أمني هو ممارسة سيئة حقا. هذا من شأنه أن يسمح لأي شخص لديه جلسة صالحة لإنتحال هذه الجلسة فقط عن طريق تغيير الجلسة. سيكون من الأفضل أن تفعل حتى تشفير متزامن أساسي من الجلسة مع مفتاح سري (يعرف فقط رمز الخلفية)، ثم فك تشفيره على البرنامج النصي للتحميل.

أقدم حاليا مشكلة مماثلة في تحميل جلسات + PHP.

باستخدام ERROR_LOG () يمكنني مراقبة ذلك عندما يرسل تطبيق Flash التحميل بيانات الملف حتى الخادم، فإنه يمر الدورة الصحيحين_ID إلى البرنامج النصي التحميل:

"ScriptData": {'session_id': session_id}،

(session_id تم تعيينها مسبقا: Var Session_id = ''؛)

لذلك، فإنه يتيح لي التحقق من نعم، ومعرف الجلسة لصفحاتي ومعرف الجلسة لتحميل البرنامج النصي هو في الواقع نفسه.

ولكن، عندما يعمل البرنامج النصي وأبدأ الجلسة بواسطة:

Session_id (DESTERN_ID)؛ session_start ()؛

بطريقة ما يتم تدمير جميع بيانات الجلسة (لقد قمت أيضا بوضع بيانات جلسة في صفيف حتى أتمكن من تحديث ومشاهدة البيانات تنمو مع كل طلب، ثم عندما أستخدم التحميل، يتم مسحه).

ليس لدي أدنى فكرة عن كيفية تصحيح هذا: /

تحرير: قد يدمر Suhosin الجلسة:

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

أضف هذا قبل ملف .j الخارجي الخاص بك مع تطبيق التحميل.

<!-- 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، لا يمكن الوصول إلى أي متغيرات جلسة قمت بتخزينها مسبقا من جلسة الحالية (التحميلية). أنت تنظر بشكل أساسي في كائن جلسة غير مرتبط تماما بالجلسة التي أجريتها. AAAH، فماذا نفعل ذلك، اجتيازها من خلال جافا سكريبت؟

يمكنك "إرسال إشارة إلى الجلسة من خلال JavaScript، ولكن JavaScript جانب العميل (مستخدم)، ولهذا السبب، يمكن للمستخدم تغيير مرجع الجلسة قبل إرساله إلى الخادم. يمكنه بفعالية مزيفة معرف الجلسة بفعالية. هذا هو في الواقع بشكل مرتعش خطير، على الأقل في حالة طلبي.

الحل...

لا تستخدم الدورة الافتراضية_START () على أنها خاصة، والتي لا يمكن الإشارة إليها بواسطة معرف. بدلا من ذلك، في كل مرة تستخدم فيها Session_Start ()، قم بتعيين معرف للجلسة التي ترغب في استخدامها، (التي أشعر بها الآن هي ممارسة جيدة بغض النظر عنها).

كل مرة ترغب في بدء جلسة

Session_id ("IDHERE")؛

session_start ()؛

هام: تحديد جلسة فريدة لكل مستخدم.

الجلسات هي المتغيرات المشتركة بين الخادم وكل عميل آخر يتصل بالتخلي المتهور. إذا كنت ترغب في تخزين متغيرات الجلسة فريدة من نوعها لكل مستخدم فردي لموقعك، يجب أن يكون Session_id نوعا من الهوية الديناميكية الفريدة تماما بالنسبة لهذا المستخدم. يمكن الوصول إلى ذلك من ملف تعريف الارتباط، أو قاعدة بيانات أكثر أمانا (معرف المستخدم الفريد؟).

تحرير: بعد القليل من البحث، يبدو أن الجلسات الافتراضية (بدون معرف) استخدم الجلسة "ppsessid". لذلك على الرغم من أنني لم أحاول ذلك حتى الآن، فإن وضع Session_id ("Phpsessid")، قبل أن تبدأ الجلسة في التحميل. قد يحل المشكلة أيضا.

ولكن لا يزال، إذا كان البرنامج المساعد يحدث فقط لاستخدام متغير جلسة متطابقة إليك داخل الجلسة نفسها، فقد ينبعك المشكلات، لذلك من الأفضل أن تجعل جلستك معرف فريد من نوعها على أي حال.

ضع علامة تسمية في المستند id = "id_usuario_logueado" and value $_SESSION[id]

ما عليك سوى كتابة التعليمات البرمجية التالية في jQuery بيان:

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

في وقت لاحق في PHP.

$id_usuario = $_POST['id_usuario'];

لقد وجدت الحل، إذا كان البرنامج النصي الخلفي يحتاج إلى مصادقة وإعادة توجيهات، فستحصل على مشكلة 302 - ما عليك سوى إنشاء وحدة تحكم جديدة أو برنامج نصي لا يحتاج إلى مصادقة.

ثم، من التعليمات البرمجية أعلاه "البرنامج النصي": '/ Admin / Uslamations / ArtistsPhotos'، إلى "البرنامج النصي": '/ Admin / Usloads-unripted / artistsphotos / ID = <؟ PHP Echo MD5 ($ theusersessessyid)؛ ؟> '،

ثم في البرنامج النصي الخلفي، قم ببساطة بالتحقق من المعرف الذي تم تمريره ومصادقة طلب التحميل مع استراتيجية مختلفة.

هنا هو الجواب مباشرة من التحميل: باستخدام جلسات مع التحميل

في الخاص بك .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