برنامه نویسی

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

درخواست متقاطع جعلی (CSRF) یکی از بدنام ترین آسیب پذیری های وب است که توسعه دهندگان باید از آن دفاع کنند. این حمله یک کاربر معتبر را در انجام ناآگاهانه اقدامات ناخواسته در یک برنامه وب فریب می دهد. به عنوان مثال ، یک وب سایت مخرب می تواند یک کاربر وارد شده را وادار کند تا آدرس ایمیل خود را تغییر دهد یا بدون رضایت آنها وجوه خود را تغییر دهد.

از آنجا که node.js به طور گسترده ای برای ساختن برنامه های وب مقیاس پذیر استفاده می شود ، درک چگونگی محافظت از آنها در برابر حملات CSRF بسیار مهم است.

درک حملات CSRF

CSRF چگونه کار می کند؟

یک حمله CSRF از اعتماد که یک برنامه وب در جلسه مرورگر کاربر دارد سوءاستفاده می کند. گردش کار معمولی یک حمله CSRF:

  1. کاربر وارد یک وب سایت می شود و از طریق کوکی ها یا نشانه های جلسه تأیید می شود.
  2. کاربر در حالی که هنوز وارد سایت مشروعیت می شود ، از یک وب سایت مخرب بازدید می کند.
  3. وب سایت مخرب با استفاده از جلسه تأیید شده قربانی ، درخواستی را به وب سایت قانونی ارسال می کند.
  4. از آنجا که مرورگر کاربر به طور خودکار شامل کوکی های احراز هویت است ، درخواست به گونه ای پردازش می شود که گویی کاربر آن را عمداً ساخته است.

نمونه ای از حمله 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 برای امنیت قوی تر
  • اعتبار سنجی ارجاع و مبدا برای مسدود کردن درخواست های غیرمجاز.
  • مجدداً تأیید و کاپچا برای تأیید هدف کاربر.
  • محدود کردن نرخ برای به حداقل رساندن اثربخشی حمله.

شما همچنین ممکن است دوست داشته باشید:

  1. 10 اشتباه رایج با کد همزمان در Node.js

  2. چرا 85 ٪ از توسعه دهندگان از Express.js استفاده می کنند

  3. اجرای استقرار صفر پایین در Node.js

  4. 10 اشتباه مدیریت حافظه مشترک در Node.js

  5. 5 تفاوت کلیدی بین ^ و ~ در Pack.json

  6. Scaling Node.js برای معماری چند مستاجر قوی

  7. 6 اشتباه رایج در طراحی دامنه محور (DDD) با Express.js

  8. 10 پیشرفت عملکرد در Node.js با استفاده از V8

  9. آیا node.js می تواند میلیون ها کاربر را اداره کند؟

  10. Express.js اسرار که توسعه دهندگان ارشد به اشتراک نمی گذارند

وبلاگ های بیشتر را از اینجا بخوانید

تجربیات خود را در نظرات به اشتراک بگذارید ، و بیایید در مورد نحوه مقابله با آنها بحث کنیم!

من را در LinkedIn دنبال کنید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا