داود خانی
5 سال پیش توسط داود خانی مطرح شد
6 پاسخ

محدود کردن تعداد جستجو در لاراول

سلام دوستان خسته نباشید، من یه پروژه سرچ دارم که می خوام وقتی بعد از تعداد جستجو به کاربر captcha رو نشون بدم،
این کاربر ما با استفاده از ip شناسایی میشه، من خودم با یه راه حل اینو نوشتم باز می خوام که شما دوستان هم نظراتتون رو بگید شاید راه بهینه تری هم باشه ممنون.
راه حل من : من اومدم تو دیتا بیس یه جدول تعریف کردم که هر ip یه number داره، که هر بار کاربر سرچ می کنه به اون number یکی اضافه می کنم. درحال حاظر این کارمو راه انداخته ، می خوام بدونم آیا شما هم راه حلی بهتری در نظر دارید !!!!!!!!!

@ali.bayat
@hossein.r.1442
@hesammousavi
@milad
@elyasbeshkani
@endworld


ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
5

منطقی ترش اینه که توی یه بازه مشخص چک کنی ببینی کاربر چن بار سرچ کرده...

اما بجای ساخت جدول میتونی از میدلور Throttle در لاراول هم استفاده کنی:
روی Route ی که میخواهی میدلور زیر رو اعمال کن:

Route::middleware('throttle:60,1')->group(function () {
    //
});

این باعث میشه هر کاربر بتونه ۶۰ درخواست در ۱ دقیقه... به سمت این URI ارسال کنه

اگر کاربر از این آستانه بگذره => با Exception ی به نام TooManyRequestsHttpException روبرو میشه

که میتونید این اکسپشن رو Catch کنید و در نهایت کاربر رو مجبور کنید از تست کپچا رد بشه.


الیاس سخاوتی نیا
تخصص : علاقه‌مند به برنامه‌‎نویسی
@elyassir 5 سال پیش مطرح شد
0

به نظر من اگه سشن و کوکی کارتون رو راه نمیدازه که همین کاری که کردین خوبه


سید حسین رضوی
تخصص : برنامه نویس وب و طراح رابط کار...
@hossein.r.1442 5 سال پیش آپدیت شد
0

ببخشید حالا من درجریان پروژتون نیستم ولی اینم درنظر بگیرید که اگه n تعداد جستجو در بازه زمانی مثلا 1 دقیقه اتفاق افتاد کپچا نشون بده
چون اینکه شما میفرمایید ممکنه کاربر در هر روز 1 جستجو انجام بده و بعد از تعداد مشخص شده شما از این به بعد هر روز باید برای جستجو کپچا رد کنه و این یه مشکل بزرگ در ux پروژه محسوب میشه


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
5

منطقی ترش اینه که توی یه بازه مشخص چک کنی ببینی کاربر چن بار سرچ کرده...

اما بجای ساخت جدول میتونی از میدلور Throttle در لاراول هم استفاده کنی:
روی Route ی که میخواهی میدلور زیر رو اعمال کن:

Route::middleware('throttle:60,1')->group(function () {
    //
});

این باعث میشه هر کاربر بتونه ۶۰ درخواست در ۱ دقیقه... به سمت این URI ارسال کنه

اگر کاربر از این آستانه بگذره => با Exception ی به نام TooManyRequestsHttpException روبرو میشه

که میتونید این اکسپشن رو Catch کنید و در نهایت کاربر رو مجبور کنید از تست کپچا رد بشه.


داود خانی
تخصص : برنامه نویس لاراول و متخصص سئو...
@davoodkhany 5 سال پیش آپدیت شد
0

@ali.bayat
سلام خسته نباشی مهندس. ببنید من تو کنترلر خودم اینطوری نوشته بودم. که تو دیتا بیس ذخیره میشد آیپی کاربر که اصلا به نظر خودم هم بهینه نیست.چیزی که شما گفتید عالیه فقط تو پیاده سازیش یکم به مشکل خوردم.
کد های خودم داخل کنترلر:

         $ip=$request->ip();
         $ipres=Recaptcha::where('ip',$ip)->first();
          if(!$ipres) {
             Recaptcha::create([
                 'ip' => $ip,
             ]);
          }else{
             if ($ipres->number >= 3){
                 Cookie::queue('davood', 'ali', 1);
                 $request->validate([
                     'g-recaptcha-response' => 'required'
                 ]);
             }else{
                 $ipres->increment('number');
             }
          }

کدهای خودم داخل بلید:

                        @if (Cookie::get('davood') == true) 
                            @recaptcha
                            @error('g-recaptcha-response')
                            <span class="invalid-feedback" role="alert">
                                    <strong>error</strong>
                                </span>
                            @enderror
                         @endif 

این کدها جوری کار می کنن که واسه سه بار اصلا اون کپچا رو نشون نمیده. بعد سه بار نشون میده.

کدهای شما داخل روت:

Route::group(['middleware' => 'throttle:3,5'], function () {
        Route::get('smartsearch', 'HomeController@search')->name('smartsearch');
});

حالا چطور باید داخل کنترلر و بلید این میدلور رو باید کنترل کنم که اگه بعد 3 بار جستجو ریکپتچا نمایش داده بشه.
یکم راهنمایی کنید ممنون میشم.


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

@davoodkhany

Exception ها در لاراول از طریق کلاس App\Exceptions\Handler مدیریت میشند.
داخل این کلاس یه متد render هست که میتونید داخلش این اکسپشن رو بگیرید و ریسپانس مورد نظر رو برگردونید
چیزی شبیه کد زیر:


public function render($request, Exception $exception){
        if ($exception instanceof TooManyRequestsHttpException)
        {
            return Redirect::back()              
                ->withErrors([
                    'alert-danger' => trans('users.many_attempts'),
            ]);
        }
}

در مستندات میتونید این موضوع رو بیشتر پیگیری کنید:
https://laravel.com/docs/7.x/errors


رافق مجتهدزاده
تخصص : برنامه نویسی php
@rafig 5 ماه پیش مطرح شد
0

@ali.bayat
سلام. من یک روت ajax دارم که به درخواست ajax پاسخ میده.

    Route::middleware('throttle:1,2')->post('/send_sms' , [\App\Http\Controllers\Admin\SmsController::class , 'sendMobileVerify'])->name('ajax.send_mobile_verify_sms');

الان این اجازه نمی ده در 2 دقیقه بیشتر از یک درخواست پاسخ داده بشه اما نمی دونم چطوری می تونم در صورتی که میدلور اجاره نداد چطور یک پیام مناسب رو در پاسخ ajax ارسال کنم؟
اگر ممکن باشه کمی بیشتر راهنمایی کنید. نتونستم از مستندات نتیجه بگیرم.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام