لطفا جاواسکریپت مرورگر خود را فعال سازید!

نحوه فعال سازی در کروم
  1. ابتدا باید اینکارو بگنید
  2. بعدش اونکارو
نحوه فعال سازی در فایرفاکس
  1. ابتدا باید اینکارو بگنید
  2. بعدش اونکارو
چگونه امنیت وب اپلیکیشن خود را ارتقاء دهیم؟

چگونه امنیت وب اپلیکیشن خود را ارتقاء دهیم؟

به‌نظر می‌رسد که نوشتن برنامه‌های ایمن‌تر،‌ آرزوی هر دولوپری باشد؛ بسیاری از دولوپرها تصور می‌کنند این کار بسیار دشوار است اما واقعیت این است که تنها با یادگرفتن اصول اولیهٔ‌ ایمن‌سازی، می‌توان جلوی بیش از ۸۰ درصد از حملات امنیتی را گرفت. در این مقاله به ۵ اصل ساده پرداخته‌ایم که رعایت آن‌ها می‌تواند امنیت برنامه‌های شما را به نحو چشمگیری ارتقاء دهد.

۱. همهٔ‌ داده‌های ورودی کاربران را اعتبارسنجی کنید
یکی از بزرگترین اشتباهات امنیتی دولوپرها -که بارها‌و‌بارها مرتکب می‌شوند- غفلت از اعتبارسنجی داده‌های ورودی کاربران است! حتی در سیستم‌های بک‌اند که تنها مورد استفادهٔ‌ کاربران به‌اصطلاح «Friendly» قرار می‌گیرند نیز نادیده‌ گرفتن اعتبارسنجی دادهٔ ورودی می‌تواند به‌طور بالقوه‌ای خطر حملات امنیتی را افزایش دهد.

مثلاً ممکن است یک مهاجم خارجی بتواند به نحوی به شبکهٔ‌ شما وارد شده و سپس از داخل شبکه و با سوءاستفاده از این ضعف امنیتی بتواند به بخش‌های گسترده‌تری از سیستم نفو‌ذ کند. بنابراین یک اصل ساده را همیشه به‌خاطر داشته باشید و آن هم این‌که هرگز به دادهٔ‌ ورودی هیچ کاربری اعتماد نکنید.

اگر با خود این‌طور تصور کنید که هر کاربری که از اپلیکیشن من استفاده می‌کند قصد حمله به آن‌را دارد،‌ خودبه‌خود فکری به حال اعتبارسنجی جزء‌به‌جزء همهٔ‌ داه‌های ورودی خواهید کرد و این درنهایت باعث ارتقاء امنیت برنامهٔ‌ شما خواهد شد.

اگر از کاربر خواسته‌اید که دادهٔ عددی وارد کند، پس حتماً بررسی کنید که دادهٔ‌ ورودی کاربر فقط عدد باشد نه چیز دیگر؛ اگر این کار را نکنید و هر داده‌ای را بپذیرید، خود را در معرض خطراتی مانند وارد کردن تگ‌های HTML به‌جای عدد قرار داده‌اید (در اکثر زبان‌های برنامه‌نویسی فانکشن‌های از پیش تعریف شده برای اعتبارسنجی داده‌های ورودی وجود دارد که به‌سادگی می‌توانید از این فانکشن‌ها استفاده کنید.)

۲. جلوی حملات XSS را بگیرید
اعتبارسنجی داده‌های ورودی به‌تنهایی کافی نیست بلکه داده‌های خروجی نیز قبل از این‌که در معرض دید کاربران قرار گیرند باید بررسی شوند؛ مخصوصاً در پروژه‌های بزرگی که در آن‌ها چندین دولوپر هم‌زمان کار می‌کنند این موضوع اهمیت بیشتری پیدا می‌کند.

فرض کنید در یک چنین پروژه‌ای، در کدهای یکی از دولوپرها اعتبارسنجی دادهٔ‌ ورودی کاربر نادیده گرفته شود؛ این موضوع بر آنچه که در دیتابیس ذخیره می‌شود تأثیر گذاشته و امنیت نرم‌افزار را به خطر خواهد انداخت چراکه دولوپر دیگری بدون توجه به سهل‌انگاری همکارش، داده‌ها را از دیتابیس گرفته و در معرض دید کاربران قرار می‌دهد که در این بین ممکن است کدهای مخربی که در دیتابیس ذخیره شده باشند نیز وجود داشته باشد!

اجازه دهید برای روشن‌تر شدن این مسئله، یک مثال از دنیای واقعی بزنیم؛ فرض کنیم که وب اپلیکیشنی داریم که در آن از یوزر می‌خواهیم که نام خود را وارد کند. دولوپری که این ماژول از وب اپلیکیشن را نوشته هم از قضا فراموش کرده است که دادهٔ ورودی را به‌اصطلاح Sanitise کند!

حال شما قصد دارید که نام کاربر را در صفحهٔ اختصاصی پروفایلش پرینت کنید اما غافل از این‌که پیش از این، کاربری مشکوک به‌جای وارد کردن نام خود، یک تکه کد جاوااسکریپت وارد کرده است که این کد قابلیت این‌را دارا است تا دست به هر کاری بزند؛ از نصب بدافزار روی سیستم کاربر گرفته تا امکان یافتن برای دسترسی به بخش‌هایی از وب اپلیکیشن که وی مجاز به دسترسی نیست (برای آشنایی بیشتر با حملات ایکس‌اس‌اس، به مقالهٔ آشنایی با مفهوم XSS و به کارگیری آن در زبان برنامه نویسی PHP مراجعه نمایید.)

۳. بهتر است هم‌زمان با کدنویسی، اصول امنیتی را اعمال کنید نه پس از تکمیل کد
پرداختن به امنیت نرم‌افزاری که از قبل نوشته شده، هزینه‌های بیشتری برای دولوپر به بار خواهد آورد؛ از سوی دیگر، در این مرحله بسیاری از نقاط آسیب‌پذیر نرم‌افزار ممکن است از دید دولوپر مخفی بمانند و به‌راحتی قابل‌تشخیص نباشند.

اگر می‌خواهید امنیت کدهای خود را بالاتر ببرید، باید در تمام مراحل توسعهٔ‌ نرم‌افزار -از مرحله‌‌ٔ طراحی گرفته تا مرحلهٔ‌ تکمیل- موضوع امنیت را مدنظر داشته باشید. در حین کار دائماً به روش‌های احتمالی مورد حمله قرار گرفتن نرم‌افزار خود فکر کنید و راه‌حلی برای مقابله با آن‌ها بیابید. همواره به یاد داشته باشید که نوشتن یک خط کد ایمن همان‌قدر زمان می‌برد که نوشتن یک خط کد ناایمن اما اگر کد ناایمنی بنویسید بعدها باید زمان زیادی را صرف شناسایی و رفع نقاط آسیب‌پذیر آن کنید.

۴. برنامه را به عنوان یک «کل منسجم» در نظر بگیرید و نه بخش‌های مجزا از یکدیگر
از آنجا که ممکن است دولوپرهای متعددی بر روی یک پروژه کار کنند،‌ هر دولوپر علاوه بر رعایت امنیت کدهایی که خود نوشته است، باید امنیت کل اپلیکیشن را نیز مد نظر داشته باشد چراکه ناایمن بودن بخش‌هایی که توسط یکی از دولوپرها نوشته شده ممکن است بر امنیت کدهای سایر دولوپرها و همچنین امنیت کل سیستم تأثیرگذار باشد.

۵. برای پسوردها و اطلاعات حساس از ذخیره‌سازی امن استفاده کنید
در مورد داده‌های حساس و مهم سعی نکنید الگوریتم رمزنگاری (Encryption) مخصوص خود را بنویسید، بلکه به‌جای آن از الگوریتم‌های نوشته شده و تست شده‌ای استفاده کنید که پیش از این امتحان خود را پس داده‌اند. به یاد داشته باشید که تاکنون هیچ‌کس از به‌کار بردن الگوریتم‌های رمزنگاری استاندارد و قوی ضرر نکرده است اما خیلی‌ها از تکیه نمودن به هوش و ذکاوت خود در این زمینه و سعی برای نوشتن الگوریتم‌های رمزنگاری خاص خود متضرر شده‌اند! اگر می‌خواهید چرخ را دوباره اختراع کنید،‌ هیچ اشکالی ندارد، اما داده‌های مهم و حساس خود را موش آزمایشگاهی نکنید!

نکتهٔ دیگری که در ارتباط با داده‌های حساس مثل پسورد، شماره کارت اعتباری و غیره وجود دارد این‌که این نوع داده‌ها را هرگز Encrypt نکنید بلکه آن‌ها را به‌اصطلاح Hash نمایید (برای آشنایی بیشتر با تفاوت‌های این دو، به مقالهٔ چه تفاوت‌هایی میان Encryption و Hashing وجود دارد؟ مراجعه نمایید.)

علاوه بر این، در نظر گرفتن یک Salt منحصربه‌فرد برای هر کاربر را هم فراموش نکنید؛ در توضیح این‌که منظور از Salt (سالت به‌معنی نمک) چیست، بایستی گفت که فرض کنیم در وب‌ اپلیکیشن خود جدولی داریم به‌نام users_table که در آن لیست کلیهٔ کاربران به‌علاوهٔ برخی اطلاعات ایشان مثل پسورد و ... ذخیره می‌شود. مسلماً نیاز به ستونی داریم همچون password که در آن پسورد کاربر را باید ذخیره کرد اما برای امنیت بیشتر، یک ستون هم می‌توانیم اضافه کنیم تحت‌عنوان salt و در آن به‌محض ایجاد یک کاربر جدید، یک عدد رندوم مثلاً ۴۵۶۷۶۳۹۸۷۶ ذخیره می‌سازیم.

وقتی که یک کاربر جدید در وب اپلیکیشن ما ثبت‌نام می‌کند، برای خود یک پسورد دلخواه مثلاً iAMs@GOOD انتخاب می‌کند اما ما قبل از هش کردن این استرینگ، Salt رندم را در کنارش قرار داده (iAMs@GOOD۴۵۶۷۶۳۹۸۷۶) سپس مجموع هر دو را هش می‌کنیم. کاری که این سالت انجام می‌دهد این است که یک لایهٔ امنیتی دیگر هم به وب اپلیکیشن ما اضافه می‌کند و این باعث می‌شود که اگر هکری توانست یکسری پسورد را بیابد، درعین‌حال به‌خاطر عدم دسترسی به عدد رندم سالت نتواند به اطلاعات بیشتری از کاربر دست یابد.

سخن آخر این که در حین کدنویسی حتماً این ۵ نکته را مد نظر داشته باشید تا بتوانید با صرف کمترین زمان بیشترین ایمنی را برای اپلیکیشن خود فراهم آورید. شما نیز دیدگاه‌ها، دانش و تجربیات خود در زمینهٔ‌ ایمن‌سازی کدها را با ما و سایر کاربران سکان آکادمی به اشتراک بگذارید.

منبع


رائفه خلیلی