امروزه از جاوا اسکریپت در همه جا استفاده میشود. این زبان هم در مرورگر و هم در بک-اند اجرا میگردد. همچنین جاوا اسکریپت یک اکوسیستم بسیار وابسته به کتابخانههای شخص ثالث است. بنابراین ایمن سازی آن همراه با بهترین روشها به منظور کاهش سطح حملهها اهمیت بالایی دارد.
اما چگونه برنامههای جاوا اسکریپت را ایمن نگه داریم؟
1. بررسی integrity
به عنوان یک توسعه دهنده فرانت-اند ممکن است از تگهای <script> برای وارد کردن کتابخانههای شخص ثالث استفاده کرده باشید. اما آیا به خطرات امنیتی این کار فکر کردهاید؟
اگر فایل منبع آن کتابخانه شخص ثالث دستکاری شود چه میکنید؟
بله اینها مواردی است که میتواند هنگام ارائه منابع خارجی در سایت اتفاق بیفتد. در نتیجه سایت شما ممکن است با یک آسیب پذیری امنیتی روبه رو شود.
به عنوان یک اقدام امنیتی برای این منظور میتوانید یک کد یکپارچگی (که به عنوان SRI شناخته میشود) به اسکریپت خود به شرح زیر اضافه کنید.
<script
src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous">
</script>
خصوصیت integrity به مرورگر اجازه میدهد اسکریپت واکشی شده را بررسی کرده و اطمینان حاصل کند که اگر منبع دستکاری شده باشد، کد بارگیری نشود.
توجه: همواره باید اطمینان حاصل کنید کدی که در ابتدا ارجاع میدهید هیچ آسیب پذیری نداشته باشد.
2. تستهای مکرر برای آسیب پذیری NPM
امیدوارم همه شما بدانید که میتوانیم از دستور npm audit برای شناسایی نقاط ضعف تمام وابستگیهای نصب شده استفاده کنیم. این کار گزارشهای آسیب پذیری را ارائه میدهد و اصلاحاتی را برای آنها فراهم میکند. اما چند بار این کار را انجام دهید؟
تا زمانی که آن را خودکار نکنیم، این آسیب پذیریها انباشته شده و رفع آنها مشکل میشود. به یاد داشته باشید برخی از آنها حتی میتوانند بسیار حیاتی باشند و اجازه دسترسیهای بالایی را میدهند.
به عنوان یک راه حل میتوانید NPM را در CI خود برای هر درخواست pull به منظور شناسایی آسیب پذیریها اجرا کنید. به این ترتیب میتوانید از بروز آسیب پذیری جلوگیری کنید.
مثال گزارش امنیتی NPM
با این حال آسیب پذیریهایی وجود دارد که برای حل آنها نیاز به مداخله دستی یک برنامه نویس است.
اخیرا گیت هاب رباتی به نام Dependabot را معرفی كرد تا وابستگیهای NPM را به طور خودكار اسكن كرده و با بیان خطرات از طریق ایمیل به شما اطلاع دهد.
یکی از این ایمیلها را برای یکی از پروژههایم دریافت کردهام
علاوه بر این فرض کنید گزینه "automated security fix PRs" را فعال کرده باشید. در این صورت گیت هاب برای رفع این مشکلات یک پیام خودکار ارسال میکند و از قبل خطرات امنیتی را برطرف میسازد.
Bit ابزاری فوق العاده قابل توسعه است که به شما امکان میدهد برنامههای ماژولار با کامپوننتهای تألیفی، نسخهای و نگهداری شده به طور مستقل ایجاد کنید.
همچنین میتوانید از آن برای ساختن برنامههای ماژولار و سیستمهای طراحی، تحویل فرانت-اند یا به اشتراک گذاری ساده کامپوننت بین برنامهها استفاده کنید.
3. به روزرسانیهای کوچک و پچهای امنیتی را فعال نگه دارید
آیا تا به حال نماد ^ یا ~ را در مقابل نسخه پکیج NPM مشاهده کردهاید؟ این نمادها نشان دهنده نسخه خودکار برای ورژنهای جزئی و پچ است (بسته به نماد آنها).
از نظر فنی نسخههای جزئی و پچ هر دو با قبل سازگار هستند و خطر وارد کردن اشکالات به برنامه را کاهش میدهند.
از آنجا که بیشتر کتابخانههای شخص ثالث آسیب پذیریهای رفع اشکال را به عنوان bump نسخه پچ منتشر میکنند، حداقل فعال کردن به روزرسانی خودکار پچ به کاهش خطرات امنیتی کمک میکند.
4- برای جلوگیری از نفوذ، اعتبارسنجیهای خود را انجام دهید
به عنوان یک قاعده کلی هرگز نباید فقط به اعتبارسنجیهای کلاینت متکی باشیم، زیرا مهاجمان میتوانند در صورت لزوم آنها را تغییر دهند. با این حال با استفاده از اعتبارسنجی برای هر ورودی، برخی از تزریقهای جاوا اسکریپت را نمیتوان حذف کرد.
به عنوان مثال اگر در قسمت کامنت هر چیزی با علامت <script><script/> تایپ کنید، با <<script>> <</script>> جایگزین شده سپس کد جاوا اسکریپت وارد شده اجرا نمیگردد. این فرایند Cross-Site Scripting (XSS) نامیده میشود.
به همین ترتیب چند روش معمول دیگر برای تزریق جاوا اسکریپت وجود دارد.
- به منظور درج یا تغییر کد جاوا اسکریپت از کنسول استفاده کنید.
- "javascript: SCRIPT" را در نوار آدرس وارد کنید.
جلوگیری از تزریق JS برای ایمن نگه داشتن برنامه شما مهم است. همانطور که قبلا اشاره کردم، داشتن مکان اعتبارسنجی یکی از روشهای جلوگیری از آن است. به عنوان مثال قبل از ذخیره هر ورودی در پایگاه داده، همه > ها را با < و همه < ها را با > جایگزین کنید.
سیاستهای امنیت محتوا (CSP) روش دیگری برای جلوگیری از تزریقهای مخرب است. استفاده از CSP بصورت زیر کاملا ساده میباشد.
Content-Security-Policy: trusted-types;
Content-Security-Policy: trusted-types 'none';
Content-Security-Policy: trusted-types <policyName>;
Content-Security-Policy: trusted-types <policyName> <policyName> 'allow-duplicates';
برای کسب اطلاعات بیشتر در مورد CSPها به این دستورالعمل مراجعه کنید.
5. Strict Mode را همیشه روشن نگه دارید
روشن بودن حالت strict باعث محدودیت شما در نوشتن کد ناامن میشود. فعال کردن آن هم به سادگی اضافه کردن خط زیر به عنوان اولین مورد در فایلهای جاوا اسکریپت است.
use strict
وقتی strict mode روشن است:
- برخی از خطاهایی که قبلا نشان داده نمیشد را مشخص میکند.
- اشتباهاتی که انجام بهینه سازی را برای موتورهای جاوا اسکریپت دشوار میکرد، رفع میکند.
- استفاده از کلمات ذخیره شده را که احتمالا در نسخههای بعدی ECMAScript تعریف میشوند، منع میکند.
- هنگام انجام اقدامات "unsafe" خطاهایی را نمایش میدهد (مانند دسترسی به شی گلوبال).
هر مرورگر مدرنی از حالت strict پشتیبانی میکند. اگر مرورگرتان از این حالت پشتیبانی نمیکند، به راحتی آن را نادیده نگیرید.
6. کد خود را lint کنید
linterها تجزیه و تحلیل ایستایی را بر روی کد شما انجام میدهند. این امر به ایجاد کیفیت و جلوگیری از دامهای مشترک کمک میکند. از آنجا که کیفیت با امنیت همگام است، فرایند لینتینگ منجر به کاهش خطرات امنیتی میشود. تعداد معدودی از ابزارهای مشهوری که برای جاوا اسکریپت استفاده میکنیم به شرح زیر است.
- JSLint
- JSHint
- ESLint
علاوه بر اینها از ابزارهایی مانند SonarCloud نیز میتوان برای شناسایی کد و آسیب پذیریهای امنیتی شناخته شده استفاده کرد. گزارش سونار به شرح زیر است.
توجه: همانطور که در تصویر بالا مشاهده میکنید، بخشی برای امنیت وجود دارد که نقاط ضعف و آسیب پذیریهای امنیتی را نشان میدهد.
7. کد خود را کوچک و فشرده کنید
مهاجمان اغلب سعی میکنند کد شما را بفهمند تا آن را هک کنند. بنابراین داشتن یک کد منبع قابل خواندن در ساخت تولید، سطح حمله را افزایش میدهد.
به عنوان یک روش معمول اگر کد جاوا اسکریپت خود را کوچک و فشرده (به هم ریخته) کنید، بهره برداری از آسیب پذیری در کدی که نوشتید دشوار است.
با این حال اگر اقدامات گستردهای برای پنهان کردن کد خود از دید کاربران / کلاینت میخواهید، باید آن را در سمت سرور و بدون ارسال آن به مرورگر نگهداری کنید.
جمع بندی
تمرکز بر امنیت به ویژه در برنامههای جاوا اسکریپت برای ایمن نگه داشتن برنامه بسیار مهم است. با حداقل ابزارها میتوانید کدهایتان را ایمن کرده تا از حملات رایج جلوگیری کنید.
علاوه بر این اگر به دنبال راه حلهای پیشرفتهتر هستید، در این صورت ابزارهایی مانند Snyk و WhiteSource وجود دارند که به طور تخصصی آسیب پذیریهای کد شما را اسکن کرده و با ادغامهای مداوم آن را خودکار میکنند.
اگر شما هم راهکارهای دیگری را سراغ دارید، میتوانید آنها را در بخش زیر به اشتراک بگذارید.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید