سؤال

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

لقد سبق تنفيذها من طرف ثالث المصادقة الحل CI (مسترجع المصادقة بيتا 2) و أنا الآن دمج JS/PHP file manager (AjaxExplorer) ، ولكن المشكلة هي أن PHP الخلفية لإدارة الملفات (نقل أو نسخ الخ) يثق كثيرا على إدخال المستخدم من المكالمات اياكس.على سبيل المثال, فإنه يفعل مثل هذه الامور (مبسط للتوضيح):

move_uploaded_file($_FILES['upload']['tmp_name'], $root.$username.$_POST['destination_dir']);

كما ترون, هناك وضوحا المخاوف الأمنية كما أنها عمياء يقبل أيا كان المسار المستخدم يلقي في!أستطيع أن أرى بالفعل شخص إرسال شيء من هذا القبيل "../AnotherUser/" كما في $_POST['destination_dir'] القيمة.

سؤالي هو: ما هي أفضل طريقة "رمل" المستخدم لكي يسمح له فقط لإدارة بلده البيانات ؟ هل أنا فقط التحقق من صحة+تصفية المدخلات ، على أمل اللحاق كل محاولة التدخل ؟ هل هناك أي المكتبات/حزم مخصصة لمعالجة هذه المسألة تحديدا?

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

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

المحلول

ما هي أفضل طريقة "رمل" المستخدم لكي يسمح له فقط لإدارة بلده البيانات ؟

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

التعقيم الواردة هي أسماء بجد.كشف '..' هي البداية فقط.أيضا-أسماء طويلة;قصيرة جدا أسماء;مجموعات من البائعين الرائدة زائدة النقاط;مجموعات من البائعين الرائدة زائدة بيضاء;مختلفة الدليل فواصل من مختلف المنصات ، أحرف غير صحيحة على بعض المنصات ، السيطرة على الحروف ؛ أحرف Unicode والبيئة-طرق محددة من التصدي لهم ؛ عدس;أسماء ('.هتكس) أو امتداد ('.php', '.cgi') التي قد تكون 'الخاصة' إلى خادم الويب الخاص بك;ويندوز محجوزة أسماء...

يمكنك قضاء عمر تعقب مضحك قليلا المراوغات من أسم دليل القواعد على مختلف المنصات ، أو يمكن أن ينسوا ذلك و استخدام قاعدة البيانات.

نصائح أخرى

لست متأكدا ما destination_dir يبدو لكن ما فكرت فيه هو تعيين الدلائل المفاتيح ثم الحصول على الدليل بناء على هذا المفتاح.على سبيل المثال:

//$_POST['destination_dir'] = '4hg43h5g453j45b3';
*_query('SELECT dir FROM destinations WHERE key = ? LIMIT 1'); //etc.

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

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

$destdir = str_replace(array('.', '/', '\\'), '', $_POST['destination_dir']); 
$destdir .= "/";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top