💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۱۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۴ محمدجوکار
نکته: ارور برای paginate با تا اینجای کار
محسن موحد حل شده توسط محسن موحد

سلام و احترام

ما توی فایل VideoFilter و فایل apply با توجه به foreachای که زدیم گفتیم اگر پارامتری توی کوئریمون بود، اونو داینامیک‌طور به متد تبدیل کن و صداش بزن. اما اگر چیزیو توی ریکوئست قرار بدیم که بین اون متدهای تعریف شده‌ی تو VideoFilter نباشه، ارور برمیگرده. مثل ارور زیر که به علت استفاده از paginate اتفاق افتاده. 

Call to undefined method App\Filters\VideoFilters::page()

 

راه حل ساده‌ای ک ب نظر من اومد، تنظیم وایت‌لیست بود.

حالا یا میتونیم ولیدیشنش کنیم و پارامتر‌های مورد نیاز رو اونجا قراربدیم، یااا هم به این روش: 

 

    public function apply(array $params)
    {
        foreach ($params as $methodName => $value)
        {
            $whiteList = ['sortBy', 'length', 'q'];
            if(!in_array($params, $whiteList)) continue;
            if(is_null($value)) continue;
            $this->$methodName($value);
        }
    }

باگی که توی کدم بود: 

در قطعه کد بالا، در شرطِ in_array! باید به جای params$ از methodName$ استفاده بشه ... 

            if(!in_array($methodName, $whiteList)) continue;
محمدجوکار ۱۸ تیر ۱۴۰۳، ۲۰:۰۵

سلام،

میتونید برای کنترل پارامترهای ورودی این موردو در middleware پیاده کنید و برای کنترل دسترسی ترکیبش کنید با policy.

اینطور از دسترسی‌های غیر مجاز هم جلوگیری میشه.

ضمناً می‌تونی بسته به هدفت، از تابع method_exists هم استفاده کنی. همچنین دستور whitelist رو خارج از حلقه بنویسید.

محسن موحد ۲۰ تیر ۱۴۰۳، ۰۱:۲۶

خیلی ممنون از توجهت آقای موحد

منظورتون اینه که وایت لیست خودم رو توی میدل‌ویر بنویسم و روت روتم قرارش بدم. 

توی میدل‌ویر از از ولیدیشنی که توی پالیسی مربوطه ایجاد کردم استفاده کنم؟

میشه یه مثال بزنید اگر اشتباه برداشت کردم؟ منظورتونو متوجه شدم منتهی نحوه‌ی صحیح استفاده‌ش رو ممنون میشم توضیح بفرمائید. 

محمدجوکار ۲۰ تیر ۱۴۰۳، ۱۴:۵۸

بله درست متوجه شدید.

بررسی میکنم یا یک مثال مینویسم و میگذارم. ببینید، موضوع اینه که چطور بهینه‌تر کدنویسی کنیم و از ابزارهایی که خود فریمورک در اختیارمون گذاشته، به درستی استفاده کنیم. چون اگه امکانات فریمورک رو خوب نشناسیم، ممکنه خیلی از کارها رو با PHP خام انجام بدیم که این یه نقطه ضعف محسوب میشه. داکیومنت رو بطور کامل مطالعه کنید و نمونه کدهای دیگران رو در هر مبحث بررسی کنید.

بهترین پاسخ
محسن موحد ۲۳ تیر ۱۴۰۳، ۱۷:۱۷