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 به سایر مباحث امنیتی هم می پردازیم:)
مطلبی دیگر از این انتشارات
کلوژر کلوژر که میگن چیه؟؟؟
مطلبی دیگر از این انتشارات
پرامیس ها در جاوااسکریپت | Promises in JavaScript
مطلبی دیگر از این انتشارات
تفاوت var و let و const در جاوا اسکریپت