از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
ایمن کردن Node.js AppBy به طور پیش فرض، Node.js به خودی خود نسبتاً ایمن است. اگرچه، قطعاً چیزهایی وجود دارد که باید مراقب آنها باشید. برای مثال، اگر برنامه وب Node شما شروع به محبوبیت بیشتر و بیشتر کند، باید بیشتر و بیشتر در مورد امنیت فکر کنید تا مطمئن شوید که کاربران خود را حفظ می کنید…
سرفصلهای مطلب
به طور پیش فرض، Node.js به خودی خود نسبتاً ایمن است. اگرچه، قطعاً چیزهایی وجود دارد که باید مراقب آنها باشید. به عنوان مثال، اگر برنامه وب Node شما شروع به محبوبیت بیشتر و بیشتر کند، باید بیشتر و بیشتر در مورد امنیت فکر کنید تا مطمئن شوید که داده های کاربران خود را ایمن نگه می دارید.
پس از دیدن چند سوال در مورد امنیت Node.js در سراسر وب در چند هفته گذشته، به این نتیجه رسیدم که نوشتن یک راهنمای کوتاه مفید خواهد بود. روی چه کاری می توانید برای ایمن سازی برنامه های خود انجام دهید.
بسیاری از پیشنهادات، اگر نه همه، در اینجا واقعاً به راحتی قابل پیگیری و پیاده سازی هستند و بیشتر مختص خود Node یا ماژول های آن هستند. بنابراین من مواردی مانند رمزگذاری یا احراز هویت کاربر را پوشش نمیدهم، که کمی خارج از محدوده این مقاله است. بسیاری از نکات در اینجا متمرکز خواهند شد روی فریمورکهای وب Node، زیرا معمولاً آسیبپذیرترین چارچوبها در برابر حمله هستند.
کد را با سودو اجرا نکنید
این خیلی بیشتر از آنچه فکر می کنید اتفاق می افتد و خطرناک است. از آنجایی که می دهد root مجوزها، در حال اجرا کد با sudo می تواند مشکلات آزاردهنده را برطرف کند، مانند نوشتن در فهرستی که کاربر مالک آن نیست. اما این تنها راه آسانی است، و این میانبرها مشکلات دیگری را ایجاد می کنند که نباید نادیده بگیرید.
در عوض، آن را پیدا کنید root علت مشکل و پیدا کردن راهی برای دور زدن آن بدون به خطر انداختن کل سیستم.
بنابراین، به عنوان مثال، اگر شما نیاز به باز کردن پورت 80 برای یک سرویس وب دارید اما نمی توانید از آنجایی که در حال اجرا نیستید root، در عوض باید از پروکسی مانند استفاده کنید Nginx برای ارسال درخواست ها از پورت 80 به هر پورت دیگری که سرویس شما واقعاً در حال اجرا است روی.
اگر زیر دوید root و برنامه شما توسط مهاجمان تسخیر می شود، سپس آنها می توانند هر کاری که می خواهند با سیستم شما انجام دهند و داده های شما این بدترین سناریویی است که میخواهید از خود محافظت کنید.
اجتناب کردن eval
به هر قیمتی
بسیار خوب، من آن را اعتراف می کنم، گاهی اوقات وسوسه انگیز است که کد خود را با اجازه دادن به اجرای جاوا اسکریپت دلخواه با استفاده از کد خود پویاتر کنید. eval
، اما باور کنید این ایده بدی است.
برخی از افراد حتی زمانی که با تجزیه ورودی کاربر تنبل می شوند سعی می کنند از آن استفاده کنند. از این گذشته، موتور جاوا اسکریپت V8 در تجزیه چیزهایی مانند عملیات ساده ریاضی بسیار خوب است، بنابراین استفاده از آن به نفع خود وسوسه انگیز است:
var result = eval('(13 + (2 * 23.249) / 0.981)');
// result = 60.398572884811415
راه های زیادی وجود دارد که می تواند دوباره شما را گاز بگیرد. مگر اینکه متخصص باشید و بدانید چگونه از خود در برابر همه اینها محافظت کنید انواع مختلف جاوا اسکریپت مخرب کد، فقط از این دوری کنید.
در اینجا یک مثال ساده از اکسپلویت آورده شده است:
var userInput = req.body.userInput; // User entered 'process.exit()'
var answer = eval(userInput); // App quits here
اجرای این کد برنامه شما را خاموش می کند و باعث انکار سرویس (DOS) برای کاربران شما می شود.
افزودن/حذف هدرهای HTTP
تعداد زیادی هدر HTTP وجود دارد که هم می تواند به شما کمک کند و هم به شما آسیب برساند. استفاده از موارد مناسب در راه درست بخش مشکل است.
Express، به طور پیش فرض، را اضافه می کند X-Powered-By: Express
هدر، که در واقع هیچ کاری انجام نمی دهد، جز اینکه به مهاجمان احتمالی می گوید که از چه چارچوب وب استفاده می کنید، و بنابراین چگونه بر اساس آن از آن بهره برداری کنند. روی آسیب پذیری های شناخته شده عمومی هرچه اطلاعات بیشتری در مورد پشته فناوری شما داشته باشند، راه های بیشتری برای حمله به آن خواهند داشت.
آنجاست کلاه ایمنی برای بازی وارد می شود Helmet یک ماژول کوچک برای Node است که با افزودن/حذف هدرهای مختلف HTTP به ایمن کردن برنامه های Express/Connect کمک می کند.
از فعال کردن هر کاری می توانید انجام دهید HSTS برای پیشگیری حملات جک کلیکی. اینها چیزهایی هستند که کار کمی انجام می دهند روی سهم شماست، اما آنها می توانند دنیای متفاوتی ایجاد کنند. بنابراین، اگر در حال ساختن یک برنامه Express هستید، این باید بیمعنا باشد (و واقعاً، برای هر سرویس وب باید این کار را انجام دهید).
از Scanning Utilities مانند Retire.js استفاده کنید
همه برنامه نویسان متخصص امنیت نیستند، و در حالی که شما باید تمام تلاش خود را برای به روز ماندن انجام دهید روی اکسپلویت های رایج مانند تزریق XSS یا SQL، دانستن همه آنها دشوار است.
برای جبران این، باید از ابزارهایی مانند استفاده کنید Retire.js، که برنامه Node شما را برای وابستگی های حاوی آسیب پذیری اسکن می کند.
به عنوان مثال، Ember.js دارای یک آسیب پذیری خاص XSS در چند نسخه مختلف است (CVE-2014-0046، همه آنها توسط Retire.js بررسی می شوند. وقتی اجرا میکنی retire
در دایرکتوری پروژه شما، بسته ها را با هم مقایسه می کند node_modules
به یک مخزن عمومی آسیب پذیری ها مراجعه کنید و به شما گزارش دهید که کدام یک از وابستگی های شما ناامن است.
در بسیاری از این بستهها آسیبپذیریهای بسیار زیادی وجود دارد که نمیتوانید خودتان را بررسی کنید، بنابراین بهتر است به ابزاری مانند این اجازه دهید این کار را برای شما انجام دهد.
با ادغام آن با Grunt یا Gulp، به لطف افزونه های ارائه شده، به راحتی می توانید این را به بخشی از گردش کار خود تبدیل کنید. جزئیات در README است.
گزینه دیگر این است که فقط آن را در a اجرا کنید prepublish
دستوری که قبل از اینکه npm بسته شما را به مخزن بفرستد اجرا می شود. فقط چیزی شبیه به این را به خود اضافه کنید package.json
:
{
"name": "myProject",
"version": "0.0.1",
"scripts": {
"prepublish": "retire",
}
}
مراقب باشید با child_process
مدول
پسندیدن eval
، استفاده کردن spawn
و exec
از child_process
ماژول می تواند واقعا مفید باشد، اما همچنین واقعا خطرناک. هر ورودی کاربر که به صورت مخفیانه وارد این دستورات شود می تواند به این معنی باشد که سیستم شما خیلی سریع در معرض خطر قرار می گیرد (به خصوص اگر برنامه خود را با sudo!).
مثلا، جادوی تصویر یک ابزار خط فرمان بسیار محبوب برای نمایش، تبدیل و ویرایش تصاویر است. با وجود تعداد زیادی از برنامه های وب که این روزها از تصاویر استفاده می کنند، Image Magick اغلب در پس زمینه برای مواردی مانند برش و تغییر اندازه استفاده می شود. برای استفاده از این ابزار با Node، ممکن است کدی مانند زیر را مشاهده کنید:
child = child_process.exec('convert ' + imageFilename + ' ' + imageFilename + '.bmp', ('-depth', '24'), function(err, stdout, stderr) {
console.log('Done');
});
این ممکن است بی ضرر به نظر برسد، اما با دقت ساخته شده است imageFilename
، می توانید هر کدی را که می خواهید در پوسته اجرا کنید.
exec
فقط در صورتی باید استفاده شود که به آن وابسته نباشد روی ورودی کاربر یا اگر استدلال ها به شدت پاکسازی شوند. حتی بهتر از آن، npm را برای کتابخانه ای که ابزار خط فرمان را بسته بندی می کند، بررسی کنید. اینها معمولاً با این نوع امنیت ساخته می شوند یا حداقل چشمان بیشتری دارند روی کد برای بررسی مشکلات برای Image Magick، چند ماژول در دسترس است، مانند گرم.
آسیب پذیری ها را درک کنید
آسیب پذیری های بسیاری در برنامه های کاربردی وب برای همه سرویس ها، صرف نظر از زبان برنامه نویسی و چارچوب مورد استفاده اعمال می شود. با اینکه، چگونه ممکن است به این سرویس ها حمله کنید روی پشته فناوری که استفاده می کنید. برای دفاع بهتر از خود، واقعاً باید یاد بگیرید که این سوء استفاده ها چگونه کار می کنند.
خوش شانس برای شما، OWASP فهرستی از 10 خطر بزرگ برای برنامه های کاربردی وب را ارائه می دهد. این موارد را مرور کنید و سپس یک تجزیه و تحلیل کامل از وب سایت خود انجام دهید تا ببینید آیا هر یک از این موارد در مورد شما صدق می کند یا خیر.
حتی بهتر است، بررسی کنید NodeGoat، که یک وب سایت قابل استقرار است که توسط OWASP ایجاد شده است تا به شما یاد دهد چگونه این خطرات را در برنامه های Node به طور خاص شناسایی کنید. هیچ راهی برای یادگیری این مفاهیم بهتر از این نیست که خودتان آن را انجام دهید.
را آموزش ارائه شده شما را از طریق تمام خطرات راهنمایی می کند و نمونه های خاصی از روش بهره برداری و دفاع در برابر آسیب پذیری ها را نشان می دهد. به عنوان مثال، در اینجا یک ویدیو ارائه شده توسط OWASP است که روش تزریق جاوا اسکریپت را با استفاده از یک فرم وب نشان می دهد:
https://www.youtube.com/watch؟v=krOx9QWwcYw
اطلاعات بیشتر
امنیت گره موضوع بزرگی است، بنابراین منطقی نیست که همه آن را در اینجا پوشش دهیم. اگر علاقه مند به دریافت جزئیات بیشتر هستید، پیشنهاد می کنم منابع بیشتری را مطالعه کنید، مانند این:
- مشاوره های امنیتی گره
- تجزیه و تحلیل امنیت برنامه وب پلت فرم Node.js (PDF)
- باز کردن فایل ها در Node.js مضر تلقی می شود
- Node.js Security Group Google
- تهدیدات امنیتی نادیده گرفته شده برای برنامه های وب Node.js (PDF)
نتیجه
اغلب اوقات امنیت یک برنامه کاربردی، یک فکر بعدی برای توسعه و طراحی است. به اندازه کافی سخت است که کد خود را به درستی کار کنید، چه رسد به اینکه استفاده از آن برای کاربرانتان ایمن باشد.
خوشبختانه شما تنها کسی نیستید که با این مشکلات روبرو می شوید، بنابراین ابزارها و منابع زیادی وجود دارد که توسط دیگران ایجاد شده است تا به شما کمک کند تا برنامه های خود را به سرعت و به راحتی ایمن کنید. فقط برای جستجوی NPM وقت بگذارید، سؤال بپرسید روی انجمن ها، یا حتی استخدام یک متخصص. قطعا ارزش وقت و پول را دارد!
با چه روش های دیگری برنامه های Node خود را ایمن می کنید؟ در نظرات به ما اطلاع دهید!
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-29 12:49:05