تکنیک های پیشرفته حمله و پیشگیری از نیروی وحشیانه Nestjs

فهرست مطالب
- درک حملات بی رحمانه
- تکنیک های پیشرفته برای جلوگیری از حملات نیروی بی رحمانه
- تنظیم محدود کردن نرخ
- اجرای قفل حساب
- افزودن تأیید Captcha
- مسدود کردن IP های مشکوک
- بهترین روشها
- پایان
حملات نیروی بی رحمانه یک تهدید امنیتی مشترک است که در آن یک مهاجم با تلاش برای ترکیب های نام کاربری/رمز عبور ، سعی در دستیابی غیرمجاز به یک سیستم دارد. مهاجم به طور سیستماتیک تمام ترکیبات ممکن از اعتبار را تا زمانی که صحیح پیدا نشود ، امتحان می کند. این می تواند به دسترسی غیرمجاز ، نقض داده ها و سایر مسائل امنیتی منجر شود. برای جلوگیری از چنین حملاتی ، باید چندین لایه دفاع را پیاده سازی کنید.
این مقاله شما را از طریق تکنیک های پیشرفته برای کاهش حملات نیروی بی رحمانه ، از جمله محدود کردن نرخ ، مکانیسم های قفل حساب و ادغام Captcha در Nestjs راهنمایی می کند.
درک حملات بی رحمانه
یک پلتفرم محبوب بانکی آنلاین ، “SecureBank” را تصور کنید که به کاربران امکان می دهد با استفاده از آدرس های ایمیل و رمزهای عبور خود وارد سیستم شوند. این پلتفرم هزاران کاربر از جمله افراد و مشاغل دارد که برای مدیریت امور مالی خود به آن اعتماد می کنند. متأسفانه ، سیستم ورود به سیستم SecureBank دارای نقص مهمی است: این مکانیزم را برای جلوگیری از تلاش های مختلف ورود به سیستم اجرا نمی کند. این نظارت آن را به یک هدف آسان برای حملات نیروی بی رحمانه تبدیل می کند.
مهاجم ، یک فرد مخرب با مهارت های اصلی برنامه نویسی ، صفحه ورود به سیستم SecureBank را در کشف می کند https://securebank.com/login
بشر این صفحه برای دسترسی به نام کاربری (ایمیل) و رمز عبور نیاز دارد. هدف مهاجم دستیابی به دسترسی غیرمجاز به حساب های کاربری ، به ویژه مواردی است که دارای مانده های بالا یا امتیازات اداری است.
مهاجم همچنین لیستی از آدرس های ایمیل مشترک (به عنوان مثال ، از نقض داده های قبلی) و یک فرهنگ لغت رمزهای عبور مکرر استفاده می کند (به عنوان مثال ، “Password123” ، “Admin123” ، “12345678”).
مهاجم یک اسکریپت ساده پایتون را برای خودکار سازی تلاش های ورود به سیستم می نویسد. اسکریپت آدرس های ایمیل و رمزهای عبور را از لیست های آماده می خواند و آنها را به نقطه پایانی ورود می فرستد. در اینجا فیلمنامه به نظر می رسد:
import requests
# List of common email addresses and passwords
emails = ["user1@example.com", "user2@example.com", "admin@securebank.com"]
passwords = ["password123", "admin123", "12345678", "qwerty"]
# Target login endpoint
login_url = "https://securebank.com/login"
# Launch the brute force attack
for email in emails:
for password in passwords:
payload = {
"email": email,
"password": password
}
response = requests.post(login_url, data=payload)
if "Login successful" in response.text:
print(f"Success! Email: {email}, Password: {password}")
break
مهاجم اسکریپت را اجرا می کند ، که شروع به ارسال هزاران درخواست ورود به سیستم برای امنیت ورود به سیستم می کند. هر درخواست ترکیبی متفاوت از ایمیل و رمز عبور را امتحان می کند. از آنجا که هیچ محدودیتی در مورد تعداد تلاش ها وجود ندارد ، اسکریپت می تواند به طور نامحدود اجرا شود تا زمانی که یک ترکیب معتبر پیدا کند.
پس از چند ساعت ، فیلمنامه با موفقیت با اعتبار زیر وارد می شود:
Email: admin@securebank.com
Password: admin123
مهاجم اکنون به حساب مدیر دسترسی دارد ، که به آنها کنترل کامل بر روی سکوی بانکی اعطا می کند. آنها می توانند وجوه را منتقل کنند ، داده های حساس مشتری را سرقت کنند یا حتی کاربران مشروع را از حساب خود قفل کنند.
تکنیک های پیشرفته برای جلوگیری از حملات نیروی بی رحمانه
الف محدود کردن نرخ
محدود کردن نرخ تعداد درخواستهایی را که کاربر می تواند در یک بازه زمانی خاص انجام دهد محدود می کند. این امر مانع از این می شود که مهاجمان در یک دوره کوتاه تلاش های ورود به سیستم بیش از حد انجام دهند.
Nestjs یک روش انعطاف پذیر برای اجرای محدودیت نرخ با استفاده از @nestjs/throttler
بسته بندی
وابستگی ها را نصب کنید
npm install @nestjs/throttler
پیکربندی Throttlermodule
در شما app.module.ts
، Throttlermodule را پیکربندی کنید:
import { ThrottlerModule } from '@nestjs/throttler';
@Module({
imports: [
ThrottlerModule.forRoot({
ttl: 60, // Time-to-live in seconds
limit: 10, // Maximum number of requests within TTL
}),
],
})
export class AppModule {}
محدود کردن نرخ را در مسیرها اعمال کنید
از دکوراتور throttle () برای اعمال محدود کردن نرخ در مسیرهای خاص استفاده کنید:
import { Throttle } from '@nestjs/throttler';
@Controller('auth')
export class AuthController {
@Throttle(5, 60) // 5 requests per 60 seconds
@Post('login')
async login(@Body() credentials: any) {
// Login logic
}
}
ب. مکانیسم قفل حساب
پس از تعداد مشخصی از تلاش های ورود به سیستم ، حساب به طور موقت قفل می شود. این حملات نیروی بی رحمانه را کند می کند و کاربر را از فعالیت مشکوک هشدار می دهد.
تلاش برای ورود به سیستم ناموفق است
تعداد تلاش های ورود به سیستم ناموفق را در پایگاه داده یا یک فروشگاه حافظه مانند Redis ذخیره کنید.
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class AuthService {
constructor(
@InjectRepository(User)
private userRepository: Repository,
) {}
async incrementFailedAttempts(userId: number): Promise {
const user = await this.userRepository.findOne({ where: { id: userId } });
user.failedAttempts += 1;
await this.userRepository.save(user);
}
async resetFailedAttempts(userId: number): Promise {
const user = await this.userRepository.findOne({ where: { id: userId } });
user.failedAttempts = 0;
await this.userRepository.save(user);
}
async isAccountLocked(userId: number): Promise {
const user = await this.userRepository.findOne({ where: { id: userId } });
return user.failedAttempts >= 5; // Lock after 5 failed attempts
}
}
حساب قفل پس از تلاش های ناکام بیش از حد
در منطق ورود به سیستم ، بررسی کنید که آیا حساب قفل شده است:
@Post('login')
async login(@Body() credentials: any) {
const user = await this.authService.validateUser(credentials);
if (!user) {
await this.authService.incrementFailedAttempts(user.id);
throw new UnauthorizedException('Invalid credentials');
}
if (await this.authService.isAccountLocked(user.id)) {
throw new UnauthorizedException('Account locked due to too many failed attempts');
}
await this.authService.resetFailedAttempts(user.id);
// Proceed with login
}
ج. ادغام کاپچا
چالش های Captcha اطمینان حاصل می کند که تلاش ورود به سیستم توسط یک انسان انجام می شود و نه یک اسکریپت خودکار.
import axios from 'axios';
@Post('login')
async login(@Body() credentials: any) {
const captchaResponse = await axios.post(
`https://www.google.com/recaptcha/api/siteverify?secret=${process.env.RECAPTCHA_SECRET}&response=${credentials.captcha}`,
);
if (!captchaResponse.data.success) {
throw new UnauthorizedException('CAPTCHA verification failed');
}
// Proceed with login
}
د. مسدود کننده IP
مسدود کردن آدرس های IP که رفتار مشکوک را نشان می دهند (به عنوان مثال ، بسیاری از تلاش های ورود به سیستم) می توانند به طور مؤثر حملات نیروی بی رحمانه را کاهش دهند.
IP ها را با تلاش های ناموفق پیگیری کنید
از Redis برای ذخیره آدرس های IP و تعداد تلاش های ناموفق آنها استفاده کنید.
import { Injectable } from '@nestjs/common';
import { InjectRedis, Redis } from '@nestjs-modules/ioredis';
@Injectable()
export class IpBlockingService {
constructor(@InjectRedis() private readonly redis: Redis) {}
async incrementFailedAttempts(ip: string): Promise {
const attempts = await this.redis.incr(`ip:${ip}:attempts`);
if (attempts === 1) {
await this.redis.expire(`ip:${ip}:attempts`, 3600); // Expire after 1 hour
}
}
async isIpBlocked(ip: string): Promise {
const attempts = await this.redis.get(`ip:${ip}:attempts`);
return attempts && parseInt(attempts) >= 10; // Block after 10 failed attempts
}
}
بررسی کنید که آیا IP قبل از پردازش درخواست ورود به سیستم مسدود شده است:
@Post('login')
async login(@Body() credentials: any, @Req() req: Request) {
const ip = req.ip;
if (await this.ipBlockingService.isIpBlocked(ip)) {
throw new UnauthorizedException('IP blocked due to suspicious activity');
}
// Proceed with login
}
جلوگیری از حملات نیروی بی رحمانه نیاز به یک رویکرد چند لایه دارد. با ترکیب این تکنیک ها ، می توانید امنیت باطن Nestjs خود را به میزان قابل توجهی افزایش دهید.
به یاد داشته باشید که هر پروژه نیازهای منحصر به فرد خود را دارد ، بنابراین این تکنیک ها را بر این اساس تطبیق دهید. با مستندات Nestjs و اکوسیستم Node.js که به سرعت در حال تحول هستند ، به روز باشید تا از این چارچوب قدرتمند نهایت استفاده را ببرید. برنامه نویسی مبارک!
بیایید متصل شویم
Linkedln | GitHub | توییتر |