سؤال

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

فكيف أفعل للسماح بحذف الملف فقط للمستخدم الذي يملكه؟

واسمحوا لي أن أعرف أشياء أخرى أيضًا إذا كنت تعتقد أنني أفعل هنا شيئًا خاطئًا أو أي شيء آخر ما تفكر فيه وتعتقد أنه سيكون مفيدًا :)

رمز PHP الخاص بي:


<?php

    $photo_id       = $_GET['photo_id'];
    $thumbnail_id   = $_GET['thumbnail_id'];    

    function deletePhotos($id){
        return unlink($id);
    }

    if(isset($photo_id)){
        deletePhotos($photo_id);
    }
    if(isset($thumbnail_id)){
        deletePhotos($thumbnail_id);
    }


 ?>

رمز AJAX الخاص بي:


function deletePhoto(photo, thumbnail){

        var photos = encodeURIComponent(photo);
        var thumbnails = encodeURIComponent(thumbnail);

        if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp=new XMLHttpRequest();
        } else {// code for IE6, IE5
          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }

        xmlhttp.onreadystatechange=function() {
            if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                document.getElementById("media").innerHTML=xmlhttp.responseText;
            }
        }
        xmlhttp.open("GET", "http://192.168.2.104/images/users/delete_photo.php?photo_id="+photos+"&thumbnail_id="+thumbnails, true);
        xmlhttp.send();
    }
هل كانت مفيدة؟

المحلول

تحتاج إلى مصادقة المستخدم بطريقة أو بأخرى.

يحتاج المستخدم إلى المصادقة مع اسم مستخدم وكلمة مرور.

يمكن استخدام جلسة PHP للتذكر ، ويجب عليك استخدام جدول قاعدة البيانات أو ملف نصي على الخادم لتخزين معلومات ملكية الملف.

بعد ذلك ، قبل إلغاء التفكير في أي شيء ، يجب أن يتأكد منطقك من أن المستخدم "المصادق عليه" هو صاحب الملف.

نصائح أخرى

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

فقط شيء مثل

$photo_id = basename($_GET['photo_id'];)
$filename = $filebase.$_SESSION['user_id']."/".$photo_id;
if (file_exists($filename) unlink ($filename);

الحد من العلم إلى الدليل مع الصور. وهذا هو ، لا تسمح .. في المسار ، أو تحقق من المسار الكامل بعد القيام RealPath (). خلاف ذلك ، يمكن للمستخدم طلب delete_photo.php?photo_id=../../../../etc/passwd وكسر النظام.

في PHP الخاص بك:

  • تأكد من $ _get ['photo_id'] و $ _get ['thumbnail_id'] لا تحتوي على "../"
  • تأكد أيضًا من قيامك بتعبئة الأساس إلى الهوية.

وإلا يمكن للمستخدمين حذف أي ملف.

بالنسبة للملكية ، يجب عليك تخزين المعلومات التي تمتلك ملفًا في مكان ما على جانب الخادم (على سبيل المثال MySQL-DB). ثم يجب عليك استشارة هذا الموقع قبل حذف الملف.

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

كما قلت من قبل ، قم بتسمية Varaibles بحيث تبدو صحيحة. عندما أرى "معرف" في varaiable. أفترض تلقائيًا كمبرمج أنه var رقمي.

واجهت نفس المشكلة وحصلت عليها باستخدام PHP's ftp_delete وظيفة

اقتراح مختلف: لا تخزن الملفات على القرص ، ولكن ضعها في قاعدة بيانات. هذا يحافظ على تمييز واضح للغاية بين موقعك+البرامج النصية و "بيانات المستخدم".

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top