جلوگیری از اسپم کردن درخواست های Ajax به سرور
سلام استاد اشرافی عزیز، استاد من برای صفحه لاگینه خودم دارم صفحاتشو با Ajax میگیرم میارم (کلا سیستم لاگینم رو میخوام کُپی دیجیکالا بسازم، اگر دیده باشید، اول یا شماره یا ایمیل میزنید، بعد اگر وجود داشت که پسورد میخواد، اگر شماره زدید و وجود نداشت اتوماتیک میره رو صفحه ثبت نام)، بعد مثلا اگر حالا مشکلی رُخ بده، دیگه این درخواست ajax نمیتونه html های پیج پسورد رو بیاره، بعد پیج اوله لاگین دیگه عوض نمیشه (همون پیج اولیه که ایمیل یا شماره میخواد) و یه آلرت به کاربر نشون میدم، ولی کاربر میتونه دوباره هی دکمه ورود رو بزنه و هی درخواست بفرسته، توی صفحه لاگین دیجیکالا، جلوی اسپم رو خیلی سریع میگیره، ولی سر در نیاوردم چجوری کار میکنه، فک نکنم فقط با یه متغیر ساده داخل کد جاوا اسکریپتیش جلوی اسپم رو بگیره، چون مثلا من اگر خیلی زیاد اسپم بدم، بعد مینویسه، بیش از حد تلاش کرده اید، بعد صفحه رو هم ریلود کنیم، اگر متغیری جلوی اسپم رو بگیره، باید ریست بشه دیگه درسته؟ چون کد های جاوااسکریپتش ریست میشه، ولی بعد از ریلود همچنان نمیزاره درخواست بدی، میگه بیش از حد تلاش کرده اید، شما میدونید اینو چجوری درستش کردن؟ کجا ذخیره میکنن تعداد ریکوئست هارو، کلا سیستم کارکردنش چجوریه.
ممنون.
پاسخ ها
bzmind
راستی همه کوکی ها رو هم پاک کردم تو دیجیکالا، بعد ریلود کردم، ولی بازم جلوی اسپم رو میگرفت.
محمد اشرافی
سلام وقت بخیر ، هم سمت قرانت میشه جلوگیری کرد ازش هم بک اند
سمت بک اند می تونید از Rate Limit استفاده کنید ، سمت فرانت هم به روش های مختلف میشه پیاده سازیش کرد
bzmind
سمت بک اند من از پکیج AspNetCoreRateLimit استفاده کردم، خوبم کار میکنه، ولی من میخوام بگم مثلا 3 تا Endpoint رو توی Blacklist بزار و فقط همینارو اجازه نده (البته بیشتر از 3 تا هست)، برای این کار باید بیام مثلا برای هر اندپوینت، واسه هرکدوم جدا جدا Rule هاشونو بزارم، یعنی این کُدی که الان پایین نوشتم کار نمیکنه اصلا، اون Endpoint اصلا یه آرایه قبول نمیکنه باید فقط یدونه باشه:
"GeneralRules": [
{
"Endpoint": [
"get:/api/user/SearchByEmailOrPhone/*",
"post:/api/auth/*",
"get:/api/user/SetNewsletterSubscription/*"
],
"Period": "15s",
"Limit": 3
},
{
"Endpoint": [
"get:/api/user/SearchByEmailOrPhone/*",
"post:/api/auth/*",
"get:/api/user/SetNewsletterSubscription/*"
],
"Period": "1m",
"Limit": 6
},
{
"Endpoint": [
"get:/api/user/SearchByEmailOrPhone/*",
"post:/api/auth/*",
"get:/api/user/SetNewsletterSubscription/*"
],
"Period": "5m",
"Limit": 13
}
]
بعد من الان 3 تا رول دارم، شما فک کنید، 3 تا اندپوینت (که بیشترم میشه) هر کدوم 3 تا رول، میشه 9 تا از این بلاک های کُد، یعنی اینجوری:
"GeneralRules": [
{
"Endpoint": "get:/api/user/SearchByEmailOrPhone/*",
"Period": "15s",
"Limit": 3
},
{
"Endpoint": "get:/api/user/SearchByEmailOrPhone/*",
"Period": "1m",
"Limit": 6
},
{
"Endpoint": "get:/api/user/SearchByEmailOrPhone/*",
"Period": "5m",
"Limit": 13
},
{
"Endpoint": "post:/api/auth/*",
"Period": "15s",
"Limit": 3
},
{
"Endpoint": "post:/api/auth/*",
"Period": "1m",
"Limit": 6
},
{
"Endpoint": "post:/api/auth/*",
"Period": "5m",
"Limit": 13
},
{
"Endpoint": "get:/api/user/SetNewsletterSubscription/*",
"Period": "15s",
"Limit": 3
},
{
"Endpoint": "get:/api/user/SetNewsletterSubscription/*",
"Period": "1m",
"Limit": 6
},
{
"Endpoint": "get:/api/user/SetNewsletterSubscription/*",
"Period": "5m",
"Limit": 13
}
]
شما راه حل دارید واسه این؟ یا کلا روش دیگه ای واسه Rate Limit کردن هست؟ تو بک اند.
ممنون.
bzmind
استاد تو پیام بالایی، منظورم از راه حل اینه که، اونطوری نوشتن خیلی طولانی میشه، شما میدونید چطور خلاصه تر بنویسمش؟ خیلی گشتم هیچی نبود، تو stackoverflow هم پرسیدم، یکی گفت فک کنم نمیشه.
حالا پکیج دیگه ای هم باشه مثل همین کار کنه خوبه.
bzmind
بعد استاد، این Modal که برای نوشتن پاسخ گذاشتید، وقتی پیام خیلی طولانی بشه، یا حتی یکم طولانی بشه، مثل پیام قبلیم، این Modal میره پایین، بعد اصلا دکمه “ارسال پاسخ” دیده نمیشه، اسکرول کنی هم نمیره پایین، من راست کلیک کردم روی یکی از Div ها، پراپرتی Top رو دستکاری کردم، دکمه دیده شد، البته بازم مشکل داشت، این رو گفتم درستش کنید خیلی بهتره.
محمد اشرافی
سلام وقت بخیر ، ببخشید من چن وقت کلا درگیر بودم ، سمت پرسش و پاسخ نیومده بودم ، اول اینکه نه مشکلی نداره باید به همین شکل پیاده سازی بشه ، چیز عجیب و غریبی هم نیست ، یا اینکه خودتون یه Rate limit بنویسید ( که کار منطقی ای نیست ) یا اینکه دینبال یه پکیج دیگه باشید ، که پیشنهاد میکنم از همین استفاده کنید
----
بابت Modal هم باید بگم بله متاسفانه چن وقت پیش به طراح گفته بودم اینو درست کنه ولی هنوز اوکی نکرده ، به زودی این مشکل رو هم بر طرف میکنیم
محمد اشرافی
البته اگر با ساختار Appsettings حال نمیکنید ، می تونید توی کلاس های سی شارپ بنویسیدش
bzmind
خواهش میکنم استاد، همین که الان وقت زاشتید و پاسخ دادید خیلی لطف کردید، ممنون از راهنمایی هاتون.