backend developer | telegram : @ali256reza
امنیت (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 : "require('fs').readdirSync('.').toString()"
}
می تونه تمام فایل های داخل مسیر فعلی کد ببینه.
چطور باید از این حملات جلوگیری کنیم؟
۱. ورودی های یوزر رو 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 : "alireza",
password : { $gt : "" }
}
مانگو دی بی اطلاعات یوزری رو می فرسته که :
username اون alireza باشه و password اون بزرگتر از "" باشه (یعنی هر پسوردی)
چطور باید از این حملات جلوگیری کنیم؟
1. ورودی های یوزر رو sanitize کنید ( می تونید از پکیج های mongo-sanitize , express-mongo-sanitize استفاده کنید)
۲. از $eq استفاده کنید
۳. یک ورودی رو به عنوان کوئری پیدا کنید و بقیه اطلاعاتی که باید چک کنید رو از طریق if چک کنید
توی سری های بعدی امنیت در وب سایت های node.js به سایر مباحث امنیتی هم می پردازیم:)
مطلبی دیگر از این انتشارات
آبجکت لیترالها در جاوا اسکریپت
مطلبی دیگر از این انتشارات
چگونه توابع (functions) در جاوا اسکریپت کار می کنند؟؟
مطلبی دیگر از این انتشارات
کلوژر کلوژر که میگن چیه؟؟؟