کارشناس ارشد بازاریابی ، علاقهمند به برنامه نویسی و جوجیتسو << اهل کرمان همه آسوده و فارغ ز بلا >>
امنیت کامل در نود جی اس ، راهکار عملی و بدون دردسر !
من تنها یک چیز میدانم و آن اینکه هیچ نمیدانم. (سقراط)
مقدمه
سلام دوست من
امیدوارم حالت مثل حال الان من که دارم این مقاله رو برای شما می نویسم،عالی باشه، خُب ماجرا از اونجایی شروع شد که بعد از اینکه سه گانه معروف آموزش یادگیری برنامه نویسی رو نوشتم (نویسنده خود را اینجا با جی کی رولینگ خالق هری پاتر مقایسه می کند !! ) ، گفتم بیام یه مقاله تخصصی تر در زمینه مورد علاقه خودم بنویسم یکم از جنبه های عمومی برنامه نویسی به سمت تخصصی تر نوشتن با شیب ملایم تغیر جهت بدم !
خُب ماجرا از اونجایی شروع شد که یه روز ابری بعد از انقلاب درونی خودم (اشاره به انقلاب کبیر فرانسه در سال 1799 ) ، همینجوری که داشتم دست نوشته های خودمو در مورد فریمورک جنگو و لاراول توی شومینه میسوزندم (با کمی اغراق !) از اینکه از بین جنگو (پایتون) و لاراول (پی اچ پی ) و نود جی اس (جی اس ) ، برای یادگیری "سمت سرور" قرار بود فقط روی یک موضوع و تکنولوژی تمرکز کنم ، از انتخاب خودم یعنی نود جی اس خیلی خوشحال بودم ، ولی یه چیزی منو از این انتخاب خیلی می ترسوند !
حقیقت چون قبلش با جنگوی پر سر و صدا و لاراول پر زرق و برق کد زده بودم ،سادگی نود جی اس برام جذاب ولی کمی ترسناک بود !
اصلا همین سادگی نود جی اس باعث شده بود انتخابش کنم ، دُرسته با یه دستور ساده ی php artisan میتونستم کل سیستم احراز هویت (ثبت نام ، ورود ، فراموشی رمز و... ) رو داشته باشم ولی واقعا این چیزی نبود من میخاستم ، از طرفی هم کلی کد اینور اونور لاراول و جنگو بود که اصلا من نمیفهمیدم اینا چی هستن ، گاهی جهت شیطنت حذفشون میکردم ببینم چه اتفاقی میوفته :D
ولی توی نود جی اس همه چیز رو خودم مینوشتم ، و این به اندازه ای برام جذاب بود ( برخلاف بعضی برنامه نویسی ها که برعکس من فکر میکنن و خب سلیقه شون اینه و صد البته قابل احترامه !) که روی تمام خوبی های جنگو و لاراول مجبور شدم چشم ببپوشم .
ولی خُب همین سادگی ، حس لُخت بودن بهم میداد ، انگاری که دارم لُخت مادر زاد بین هکر های کِرمون (کرمان) قدم میزنم :D
این فوبیای هک شدن دست از سرم بر نمی داشت ، خلاصه سرتون رو به درد نیارم باید دست به کار میشدم ، یه بار برای همیشه خیال خودمو ( و الان خیال شما رو ) راحت کنم.
تصمیم گرفتم برم وسط دنیای هک و امنیت ، آره بهترین کار این بود که از دید هکر ها به نود جی اس نگاه کنم پس بدون هیچ اتلاف وقتی عینک دودی رو زدم و با ابزار هکری افتادم به جون نود جی اس !
شروع کردم به تحقیق کردن و مقاله خوندن ، راستش نیم نگاهی هم به کتاب مقدس هکرها هم می انداختم، اوقات فراغتم رو هم توی یوتیوب کلیپ با لهجه هندی میدیم برای ریاضت و تزکیه نفس !
خلاصه سرت رو درد نیارم ، در تحقیقات فوق حساس خودم به دو دسته بندی کلی رسیدم :
مشکلات (باگ های) نوع اول : که ما اون ها رو با نوشتن کد ها حل میکنیم ، اصولا این نوع مشکلات از بی دقتی برنامه نویس ها بوجود میاد و مختص زبان یا فریمورک خاصی نیست ، مشکلاتی مثل عدم هش کردن پسورد ، نگذاشتن تاریخ مصرف برای توکن ها ،عدم اعتبار سنجی ورودی های کاربران در سمت سرور و...
مشکلات (باگ های ) نوع دوم: مشکلاتی هستند که لزوما ربطی به نوع برنامه نویسی ما ندارند و به نوعی باگ ابزارهای برنامه نویسی محسوب میشن ، این نوع باگ ها در ذات همه ی ابزار نهفته هستن ولی چون خالق خیلی از این ابزار ها از قبل این مشکلات رو به صورت پیشفرض (مثلا جنگو) رفع کرده ما فکر میکنیم این ابزار از این قاعده مستثنی هستند ! در این نوع باگ برنامه نویس خیلی مقصر نیست ولی باید جهت رفع مشکل اقدام کند .
خب من توی این مقاله میخوام روش جلوگیری از مشکلات نوع دوم رو براتون توضیح بدم :
من این مشکلات (حملات) رو به 5 دسته ی کلی تقسیم کردم :
1- NOSQL INJECTION
2- HTTP headers attacks
3-XSS attack
4-HTTP Parameter Pollution attacks
5-DDoS attacks
من قرار نیست اینجا براتون این نوع حملات و باگ ها رو توضیح بدم خودتون میتونید توی گوگل سرچ کنید در موردشون اطلاعات کسب کنید ، چون اصلا توی یک مقاله نمیشه توضیح داد این ها رو ! مثلا باگ نوع دوم خودش حداقل 15 مورد زیر مجموعه داره (تا اونجا که من مطالعه کردم ، شاید بیشتر هم باشن !)،ولی خب میتونم خیالتون رو راحت کنم که حداقل 95% حملات رو با دستورالعملی که جلوتر بهتون میگم قابل پیشگیری هستن.
NOSQL INJECTION تزریق کدها
متاسفانه این مدل باگ خیلی بی ریخت و ضایع هستن ، اصلا یه جورایی میشه گفت اصن یه وضعی !
شاید بگید خب این مدل باگ مربوط به دیتابیس هست ، اوکی قبول دارم ولی به هر حال شما باید یه مدل دیتابیس (NoSQL یا SQL ) استفاده کنید که باید بگم متاسفانه هر دو دارای این باگ مخوف هستن . چون من خودم از دیتابیس MONGO استفاده میکنم ، پس No SQL ها رو توضیح میدم ..
در توضیح این باگ همینقدر بگم که اگر کد زیر رو به صورت ریکوئست بفرستم برای API شما میتونم بدون اطلاع از رمز ورود ، به کاربر admin وارد شوم خخخخخ
{"username":"admin","password":{"$ne": 1}}
راه حلی برای NOSQL INJECTION
بهترین راه استفاده پکیج های تحت عنوان sanitize هست ، من چون از اکسپرس جی اس استفاده میکنم به صورت زیر با استفاده از Middleware عمل میکنم ولی شما میتونید از پکیج های دیگه مربوط به فریمورک مورد نظر خودتون استفاده کنید :
npm install express-mongo-sanitize [github]
const mongoSanitize = require('express-mongo-sanitize');
app.use(mongoSanitize());
حمله های HTTP headers attacks
حملات HTTP headers خیل تنوع بالایی دارند در نگاه اول شاید خیلی خفن به نظر بیان ولی خُب اصلا اینجوریام نیست ! ( من حدود 15 تا از این حمله تو مقالات مختلف دیدم )
چند تا از این نوع حمله ها :
و...
برای حل این مشکلات من شخصا خودم از پکیج کلاه ایمنی :| یا همون helmet استفاده میکنم ، به نظرم استفاده ازش برای همه باید اجباری بشه !
const express = require('express') [github]
const helmet = require('helmet')
const app = express()
app.use(helmet())
xss تزریق اسکریپت
این مدل تقریبا یه جورایی زیر شاخه دسته بندی دوم هم محسوب میشه ولی به دلیل اهمیتش تصمیم گرفتم جداگانه بهش بپردازم .
در سال 2014 حمله Cross Site Scripting یا به شکل مختصر XSS، (مخففش در اصل باید باشه CSS ولی چون با زبان CSS اشتباه گرفته نشه ، گذاشتن XSS )در تستهای امنیتی اپلیکیشنهای تحت وب، به عنوان بیشترین مورد آسیب پذیری در این اپلیکیشن ها شناخته شد. موارد بالا اهمیت XSS را نشان میدهند که تقریبا تمام اپلیکیشنهای تحت وب باید برای برخورد با این حمله آمادگی داشته باشند چون کاملا در معرض آن قرار دارند.
به شکل خلاصه آسیب پذیری XSS میتواند در هر جایی از اپلیکیشن رخ دهد که در آن، اطلاعات از یک منبع خارجی مانند ورودی کاربر به اپلیکیشن داده شوند و آن اطلاعات پتانسیل حمل کد اجرایی مانند جاوا اسکریپت را دارا باشند که ذاتا میتوانند خطرناک عمل کنند.هدف از حمله XSS، تزریق کدهای مخرب برای اجرا در صفحات وبی که به کاربرانشان اعتماد کرده اند(اگر بخواهیم خوش بین باشیم) است.
به طور کلی حملهی XSS به دو دسته ی اصلی تقسیم میشود:
Non-Persistant XSS یا Reflected XSS
Persistant XSS یا Stored XSS
پکیج های زیادی برای این مشکل هست ولی خب طبق تست و برسی های که انجام دادم بنده بهترینش رو پکیج زیر میدونم :
npm install xss-clean --save [github]
const xss = require("xss-clean");
app.use(xss())
HTTP Parameter Pollution attacks "به اختصار "اچ پی پی
انتقال اطلاعات با استفاده از پروتکل HTTP می تواند به روش های مختلفی انجام شود ، مانند:
Within the URI – using the GET parameters
Within the request body – using the POST parameters
In the HTTP headers – using the COOKIE header
param1=value1& param2=value2
در حملات HPP ، مهاجم چندین پارامتر مثل بالا توی یه درخواست HTTP ارسال میکنه، پس مکانیسم های امنیتی که هر نمونه پارامتر را بصورت جداگانه بررسی می کنن ، یا کل داده ها رو به صورت یک رشته واحد پردازش می کنن ، دیگه قادر به شناسایی حمله نخواهند بود.مثال زیر نمونه ای از این حمله رو در فریمورک ASP.NET که نصف سایت های دولتی ایرانی ازش استفاده میکنن رو نشون میده (یعنی فقط مخصوص نود جی اس نیست ) البته در گیتهاب ابزاری که معرفی کردم برای مقابله مثال های جالبی در جی اس براش زده که میتونید بعدا مطالعه کنید .
Attack using HPP: http://webApplication/showproducts.asp?prodID=9 /*&prodID=*/UNION /*&prodID=*/SELECT 1 &prodID=2 &prodID=3 FROM /*&prodID=*/Users /*&prodID=*/ WHERE id=3 —
راه حل : استفاده از پکیج HPP
npm install hpp --save [github]
const hpp = require("hpp");
app.use(hpp());
DDOS حمله از دسترس خارج کردن سرویس
این نوع حمله رو اینجوری تعریف کردن :
تلاش برای خارج کردن منابع شبکه از دسترس کاربران مجازش میباشد؛ اگرچه منظور از حمله DOS و انگیزه انجام آن ممکن است متفاوت باشد، اما بهطور کلی شامل تلاش برای قطع موقت یا دائمی یا تعلیق خدمات یک میزبان متصل به اینترنت است.بنابراین نمیتواند به سرویسهای مورد نظرش سرویس بدهد و همچنین سیاستهای مورد قبول فراهم کنندگان سرویسهای اینترنتی را نقض میکنند.
خُب قطعا متوجه شدید هدف این حمله فشار روی سخت افزار های سرور هست البته سرور ها و شرکت های که خدمات میزبانی رو ارائه میدن نسبت به قبل خیلی پیشرفت کردن و انواع تنظیمات و کانفیگ های مخصوص رو برای جلوگیری از DDOS انجام میدن به قل خودشون آنتی دیداس (نرم افزاری و سخت افزاری ) روی سرورها پیدا میکنن ، خب شاید بگید این ربطی به ما نداره و در حوزه وظیفه DevOps باشه ولی باید بگم سخت در اشتباه هستید ، شما باید حتما تعداد ریکوئست های هر آی پی رو به یه رنج معقول محدود کنید چون تعداد ریکوئست بالا فقط مشکل دیداس رو بوجود نمیاره و ممکنه یوزر و پسورد کاربران شما با استفاده از نرم افزار های کرک مثل سنتری ، لو بره !
من برای حل این مشکل از روش زیر استفاده میکنم :
npm i express-rate-limit [github]
const limiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 100
});
app.use(limiter);
تنظیمات بالا این اجازه رو به هرکاربر میده که فقط در هر 15 دقیقه حداکثر 100 ریکوئست به ما بده !
سخن آخر ...
طبق نظر کاملا شخصی من : بنده معتقدم همینطوری که یه پلیس با اینکه خلاف کار نیست و اصلا وظیفه اش مبارزه با خلافکاراس ،ولی از خیلی از خلافکارا بهتر راه های پیچوندن رو بلده :D شما هم شاید هیچ وقت تا آخر عمرتون نیاز نباش کسی و چیزی رو هک کنید ولی به عنوان یه توسعه دهنده بک اند ( یا دولوپر ) وظیفه دارید دانش خودتون رو توی زمینه هک و امنیت بالا ببرید و بخشی از زمان مطالعاتی خودتون رو توی این حوزه صرف کنید .
خُب از اونجایی که من شما تنبلا رو میشناسم ، کل این تنظیمات رو برای اکسپرس جی اس انجام دادم و گذاشتم توی گیت هاب به صورت کامنت گذاری شده خیلی شیک و مجلسی، تر و تمیز ؛ فقط کافیه برای شروع هر پروژه از این فایل با خیال راحت استفاده کنید (ستاره یادتون نره )
هشدار : مقاله زیر به شدت اعتیاد آور است !
ساختار داده ها و الگوریتم ها به زبان آدمیزاد !
قطعا نظرات شما مایهی مفاخرت و مباهات اینجانب می باشد ?
در صورت دنبال کردن بندهی حقیر در ویرگول ، سعی میکنم مقالاتی با کیفیت تر از قبل به دلیل احساس حضور شما منتشر کنم .
برای مطالعه بیشتر :
NOSQL INJECTION ...
HTTP Response Splitting Software Attack ...
Reflected Cross Site Scripting (XSS) Attacks
Node.js – Protection from Brute Force and DDOS Attacks
مطلبی دیگر از این انتشارات
برگه تقلب کد تمیز | Clean Code Cheat Sheet
مطلبی دیگر از این انتشارات
آموزش ساخت آزمون آنلاین در گوگل فرم
مطلبی دیگر از این انتشارات
کورسرا: بهترین دانشگاههای دنیا، آموزش، مدرک؛ مجانی!