چگونه می توان برنامه های Node.js را از CSRF محافظت کرد؟

درخواست متقاطع جعلی (CSRF) یکی از بدنام ترین آسیب پذیری های وب است که توسعه دهندگان باید از آن دفاع کنند. این حمله یک کاربر معتبر را در انجام ناآگاهانه اقدامات ناخواسته در یک برنامه وب فریب می دهد. به عنوان مثال ، یک وب سایت مخرب می تواند یک کاربر وارد شده را وادار کند تا آدرس ایمیل خود را تغییر دهد یا بدون رضایت آنها وجوه خود را تغییر دهد.
از آنجا که node.js به طور گسترده ای برای ساختن برنامه های وب مقیاس پذیر استفاده می شود ، درک چگونگی محافظت از آنها در برابر حملات CSRF بسیار مهم است.
درک حملات CSRF
CSRF چگونه کار می کند؟
یک حمله CSRF از اعتماد که یک برنامه وب در جلسه مرورگر کاربر دارد سوءاستفاده می کند. گردش کار معمولی یک حمله CSRF:
- کاربر وارد یک وب سایت می شود و از طریق کوکی ها یا نشانه های جلسه تأیید می شود.
- کاربر در حالی که هنوز وارد سایت مشروعیت می شود ، از یک وب سایت مخرب بازدید می کند.
- وب سایت مخرب با استفاده از جلسه تأیید شده قربانی ، درخواستی را به وب سایت قانونی ارسال می کند.
- از آنجا که مرورگر کاربر به طور خودکار شامل کوکی های احراز هویت است ، درخواست به گونه ای پردازش می شود که گویی کاربر آن را عمداً ساخته است.
نمونه ای از حمله CSRF
بیایید بگوییم که شما یک برنامه بانکی با Node.js. ساخته شده اید کاربر وارد سیستم شده است و با ارسال یک امکان انتقال پول را دارد POST
درخواست:
POST /transfer HTTP/1.1
Host: bank.com
Cookie: session_id=12345
Content-Type: application/json
{ "amount": 1000, "to_account": "hacker123" }
اکنون ، یک هکر با یک درخواست پنهان یک صفحه وب ایجاد می کند:
هنگامی که کاربر ناآگاهانه بر روی دکمه کلیک می کند ، فرم ارسال و انتقال پول به حساب مهاجم زیرا کوکی های جلسه به طور خودکار گنجانده شده اند.
نحوه محافظت از برنامه های Node.js از CSRF
چندین استراتژی برای محافظت از برنامه های Node.js از حملات CSRF وجود دارد. بیایید با جزئیات به آنها بپردازیم.
1. از نشانه های CSRF استفاده کنید
یک توکن CSRF یک مقدار تصادفی و منحصر به فرد است که توسط سرور تولید می شود و در درخواست های حساس گنجانده می شود. سرور قبل از پردازش هر عملی ، این نشانه را تأیید می کند.
نحوه اجرای نشانه های CSRF در Node.js
اگر از Express.js استفاده می کنید ، csurf
Middleware اجرای محافظت از CSRF را آسان می کند.
مرحله 1: نصب کنید csurf
ظروف میانبر
npm install csurf
مرحله 2: پیکربندی csurf
در express.js
const express = require('express');
const csrf = require('csurf');
const cookieParser = require('cookie-parser');
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());
// Enable CSRF Protection
const csrfProtection = csrf({ cookie: true });
app.use(csrfProtection);
app.get('/form', (req, res) => {
res.send(`
req.csrfToken()}">
`);
});
app.post('/submit', (req, res) => {
res.send('Form submitted successfully!');
});
app.listen(3000, () => console.log('Server running on port 3000'));
در این مثال:
-
csrf()
یک نشانه منحصر به فرد CSRF ایجاد می کند. - این نشانه در فرم به عنوان یک قسمت ورودی پنهان گنجانده شده است.
- با ارسال فرم ، سرور توکن را تأیید می کند.
2. از کوکی های Samesite استفاده کنید
کوکی های Samesite مانع از ارسال مرورگرها کوکی های تأیید اعتبار با درخواست های متقابل می شوند. این حمله به CSRF با اطمینان از ارسال کوکی ها فقط در صورتی که درخواست از همان وب سایت باشد ارسال می شود.
برای فعال کردن کوکی های Samesite در جلسات اکسپرس ، پیکربندی جلسه خود را تغییر دهید:
const session = require('express-session');
app.use(session({
secret: 'your_secret_key',
resave: false,
saveUninitialized: true,
cookie: { sameSite: 'strict' }
}));
تنظیم sameSite: 'strict'
تضمین می کند که کوکی ها در درخواست های متقابل ارسال نمی شوند و از حملات CSRF جلوگیری می کنند.
3. از کوکی های ایمن و httponly استفاده کنید
کوکی های ایمن مانع از سرقت داده های جلسه بر روی اتصالات ناامن می شوند و کوکی های httponly از حملات مبتنی بر جاوا اسکریپت جلوگیری می کنند.
پیکربندی جلسه خود را به شرح زیر تغییر دهید:
app.use(session({
secret: 'your_secret_key',
resave: false,
saveUninitialized: true,
cookie: { httpOnly: true, secure: true, sameSite: 'strict' }
}));
4
مرورگرهای وب به طور خودکار ارسال می کنند Referer
وت Origin
هدرهای با درخواست. شما می توانید این هدرها را تأیید کنید تا اطمینان حاصل شود که درخواست ها از منابع قابل اعتماد ارائه می شود.
به عنوان مثال Middleware برای اعتبارسنجی هدرهای مبدا:
const allowedOrigins = ['https://yourwebsite.com'];
app.use((req, res, next) => {
const origin = req.headers.origin || req.headers.referer;
if (!origin || allowedOrigins.includes(origin)) {
return next();
}
res.status(403).send('CSRF attack detected!');
});
5. برای اقدامات حساس به تأیید اعتبار نیاز دارید
برای اقداماتی مانند انتقال صندوق ، تغییر رمز عبور یا تغییر داده ها ، کاربران را ملزم می کند که قبل از پردازش درخواست مجدداً تأیید کنند.
مثال:
app.post('/transfer', (req, res) => {
if (!req.session.isAuthenticated) {
return res.status(403).send('Authentication required!');
}
// Proceed with transfer logic
});
6. CAPTCHA را برای درخواست های مهم پیاده سازی کنید
استفاده از CAPTCHA در اقدامات حساس مانند تغییر رمز عبور یا پرداخت ، تضمین می کند که درخواست های خودکار توسط مهاجمان قابل اجرا نیست.
recaptcha Google یک انتخاب محبوب است:
- در Google Recaptcha ثبت نام کنید
- تأیید Captcha را روی فرم های خود ادغام کنید
- پاسخ ها را در سمت سرور تأیید کنید
7. از محدود کردن نرخ API استفاده کنید
محدود کردن تعداد درخواستهایی که کاربر می تواند تأثیر حملات خودکار CSRF را کاهش دهد.
مثال با express-rate-limit
:
npm install express-rate-limit
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100 // Limit each IP to 100 requests per window
});
app.use('/transfer', limiter);
پایان
حملات CSRF در صورت عدم فشار ، می تواند عواقب ویرانگر داشته باشد. محافظت از برنامه های Node.js به یک رویکرد چند لایه نیاز دارد ، از جمله:
- نشانه های CSRF برای تأیید درخواست های قانونی کاربر.
- کوکی های samesite برای جلوگیری از انتقال کوکی در سایت ها.
- کوکی های ایمن و httponly برای امنیت قوی تر
- اعتبار سنجی ارجاع و مبدا برای مسدود کردن درخواست های غیرمجاز.
- مجدداً تأیید و کاپچا برای تأیید هدف کاربر.
- محدود کردن نرخ برای به حداقل رساندن اثربخشی حمله.
شما همچنین ممکن است دوست داشته باشید:
-
10 اشتباه رایج با کد همزمان در Node.js
-
چرا 85 ٪ از توسعه دهندگان از Express.js استفاده می کنند
-
اجرای استقرار صفر پایین در Node.js
-
10 اشتباه مدیریت حافظه مشترک در Node.js
-
5 تفاوت کلیدی بین ^ و ~ در Pack.json
-
Scaling Node.js برای معماری چند مستاجر قوی
-
6 اشتباه رایج در طراحی دامنه محور (DDD) با Express.js
-
10 پیشرفت عملکرد در Node.js با استفاده از V8
-
آیا node.js می تواند میلیون ها کاربر را اداره کند؟
-
Express.js اسرار که توسعه دهندگان ارشد به اشتراک نمی گذارند
وبلاگ های بیشتر را از اینجا بخوانید
تجربیات خود را در نظرات به اشتراک بگذارید ، و بیایید در مورد نحوه مقابله با آنها بحث کنیم!
من را در LinkedIn دنبال کنید