امنیت (node.js (Injections

چند نوع از injection ها رو در این قسمت مقاله بررسی می کنیم :

  • JS Injection

هرگز هرگز هرگز ورودی های یوزر رو به عنوان یک پارامتر از eval , setTimeout , setInterval عبور ندید!!!

تابع eval یک استرینگ رو می گیره و اون رو اجرا می کنه
توابع setTImeout, setInterval یک فانکشن به عنوان کالبک میگیرند و اون رو اجرا می کنند

یک مثال ساده :

//...
const username = 'process.exit()';
eval(username);
//...

وقتی که شما کد رو اجرا کنید پراسس نود جی اس بسته میشه.


  • FS Injection

مانند مثال بالا اگر ورودی یوزر رو به عنوان پارامتر از توابع eval , setTimeout , setInterval عبور بدیم هکر می تونه فایل های داخل سرور رو ببینه ، اون ها رو بخونه و اون ها رو تغییر بده یا حذف کنه‌!

یک مثال برای این نوع از حملات :

//...
router.post('/get-username', (req, res) => {
    res.send(eval(req.body.username));
}

اگر یوزر به این روتر در خواست بزنه و username این عبارت بذاره :

request-body :
{
    username : &quotrequire('fs').readdirSync('.').toString()&quot
}

می تونه تمام فایل های داخل مسیر فعلی کد ببینه.

چطور باید از این حملات جلوگیری کنیم‌‌؟
۱. ورودی های یوزر رو validate کنید ( می تونید از پکیج هایی مثل joi , fastest-validator‌‌ استفاده کنید )
۲. ورودی های یوزر رو از توابعی که بالا گفته شد به عنوان پارامتر عبور ندید
  • NoSql Injection

هکر می تونه با استفاده از این ترفند به اطلاعاتی که نباید دسترسی پیدا کنه ، دسترسی پیدا کنه یا تغییر در اون ها اعمال کنه!

به طور مثال حمله کننده می خواد با استفاده از نام کاربری یکی دیگه وارد بشه ولی رمزش رو نداره.

//...
router.post('/login', (req, res) => {
    User.findOne({ 
        username : req.body.username,
        password : req.body.password
    }).then(user => res.send(user);
}

هکر از این ترفند استفاده می کنه تا به حساب کاربری دسترسی پیدا کنه :

request-body : {
     username : &quotalireza&quot, 
     password : { $gt : &quot&quot }
}

مانگو دی بی اطلاعات یوزری رو می فرسته که :
username اون alireza باشه و password اون بزرگتر از "" باشه (یعنی هر پسوردی)

چطور باید از این حملات جلوگیری کنیم‌‌؟
1. ورودی های یوزر رو sanitize کنید ( می تونید از پکیج های mongo-sanitize , express-mongo-sanitize استفاده کنید)
۲. از $eq استفاده کنید
۳. یک ورودی رو به عنوان کوئری پیدا کنید و بقیه اطلاعاتی که باید چک کنید رو از طریق if چک کنید


توی سری های بعدی امنیت در وب سایت های node.js به سایر مباحث امنیتی هم می پردازیم‌:)