سلام دوستان خسته نباشید، من یه پروژه سرچ دارم که می خوام وقتی بعد از تعداد جستجو به کاربر captcha رو نشون بدم،
این کاربر ما با استفاده از ip شناسایی میشه، من خودم با یه راه حل اینو نوشتم باز می خوام که شما دوستان هم نظراتتون رو بگید شاید راه بهینه تری هم باشه ممنون.
راه حل من : من اومدم تو دیتا بیس یه جدول تعریف کردم که هر ip یه number داره، که هر بار کاربر سرچ می کنه به اون number یکی اضافه می کنم. درحال حاظر این کارمو راه انداخته ، می خوام بدونم آیا شما هم راه حلی بهتری در نظر دارید !!!!!!!!!
@ali.bayat
@hossein.r.1442
@hesammousavi
@milad
@elyasbeshkani
@endworld
منطقی ترش اینه که توی یه بازه مشخص چک کنی ببینی کاربر چن بار سرچ کرده...
اما بجای ساخت جدول میتونی از میدلور Throttle در لاراول هم استفاده کنی:
روی Route ی که میخواهی میدلور زیر رو اعمال کن:
Route::middleware('throttle:60,1')->group(function () {
//
});
این باعث میشه هر کاربر بتونه ۶۰ درخواست در ۱ دقیقه... به سمت این URI ارسال کنه
اگر کاربر از این آستانه بگذره => با Exception ی به نام TooManyRequestsHttpException روبرو میشه
که میتونید این اکسپشن رو Catch کنید و در نهایت کاربر رو مجبور کنید از تست کپچا رد بشه.
ببخشید حالا من درجریان پروژتون نیستم ولی اینم درنظر بگیرید که اگه n تعداد جستجو در بازه زمانی مثلا 1 دقیقه اتفاق افتاد کپچا نشون بده
چون اینکه شما میفرمایید ممکنه کاربر در هر روز 1 جستجو انجام بده و بعد از تعداد مشخص شده شما از این به بعد هر روز باید برای جستجو کپچا رد کنه و این یه مشکل بزرگ در ux پروژه محسوب میشه
منطقی ترش اینه که توی یه بازه مشخص چک کنی ببینی کاربر چن بار سرچ کرده...
اما بجای ساخت جدول میتونی از میدلور Throttle در لاراول هم استفاده کنی:
روی Route ی که میخواهی میدلور زیر رو اعمال کن:
Route::middleware('throttle:60,1')->group(function () {
//
});
این باعث میشه هر کاربر بتونه ۶۰ درخواست در ۱ دقیقه... به سمت این URI ارسال کنه
اگر کاربر از این آستانه بگذره => با Exception ی به نام TooManyRequestsHttpException روبرو میشه
که میتونید این اکسپشن رو Catch کنید و در نهایت کاربر رو مجبور کنید از تست کپچا رد بشه.
@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 بار جستجو ریکپتچا نمایش داده بشه.
یکم راهنمایی کنید ممنون میشم.
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
@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 ارسال کنم؟
اگر ممکن باشه کمی بیشتر راهنمایی کنید. نتونستم از مستندات نتیجه بگیرم.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟