در دنیایی که در آن به سر میبریم (یعنی دنیای دیجیتال) روز به روز به اهمیت امنیت، حریم خصوصی و مقابله در برابر نفوذ افزوده میشود چرا که زندگی اکثر کاربران به گونهای با فناوریهای مدرن عجین شده است که دیگر به سختی میتوان از فناوری دل کند و مجرمین سایبری هم از این فرصت سوءاستفاده کرده و به دنبال راههایی برای نفوذ به سیستمهای سازمانها، شرکتها و حتی کاربران خانگی هستند. در این مقاله، با شش مرحله از تستهای امنیتی آشنا میشوید تا بتوانید تا حد امکان از ایمنی و امنیت وب اپلیکیشنها اطمینان حاصل کنید.
مدلسازی تهدید
ایمن کردن یک برنامه، زمان و منابع زیادی میطلبد. با در نظر گرفتن دهها نرمافزاری که توسط کارکنان در تمام سطوح شرکتها استفاده میشوند، ضروری به نظر میرسد تا اطمینان حاصل کنیم که تمهیدات امنیتی به بهترین شکل ممکن پیادهسازی شدهاند و به همین دلیل هم هست که Threat Modeling (مدلسازی تهدید) یک گام اولیهٔ حیاتی در تست امنیتی برنامهها است. در این مرحله، امکان تحلیل برنامه، شناسایی تهدیدات و رتبهبندی آنها بر اساس شدت و در نهایت اختصاص زمان و منابع کافی به منظور جلوگیری از آنها در نظر گرفته میشود.
احراز هویت
Authentication (احراز هویت) یک خطمقدم بسیار مهم دفاعی به حساب میآید و در واقع اطمینان حاصل میکند که تنها کاربران و سرورهای به رسمیت شناخته شده، اجازهٔ تعامل با یک برنامه را دارند. مشکلات احراز هویت کاربری از علل شایع نفوذ به سیستمها و دسترسی به دادههای آنها هستند و در این بین، داشتن نام کاربری و پروتکلهای قوی رمزعبور کاربران نیز از اهمیت زیادی برخوردارند.
همچنین داشتن قابلیت Two-factor Authentication (احراز هویت دو مرحلهای) امری ضروری برای یک وب اپلیکیشن اصولی است. همچنین تعداد دفعاتی که کاربران برای لاگین کردن تلاش میکنند، همگی باید به صورت لاگ در سیستم ثبت شوند و عدم موفقیت کاربران در لاگین کردن میبایست با عملیات قفل شدن حساب کاربری توأم گردد.
کنترل سطوح دسترسی
هنگامی که هویت یک کاربر توسط یک برنامهٔ تحت وب تصدیق شد، Access Control (کنترل سطوح دسترسی) وارد صحنه شده و تعیین میکند که چه پیجها و دادههایی توسط کاربر مجاز به دسترسی، دیدن و تغییر هستند. دادن دسترسی بیش از حد به کاربران، موجب بروز نفوذهای ناخواستهای میشود؛ لذا منطقی به نظر میرسد که سطح دسترسی را به حداقل برسانیم تا کاربران حداقل میزان دسترسی را به دادههای سیستم داشته باشند.
کامند اینجکشن
Command Injection (تزریق دستور) هنگامی رخ میدهد که کدها و دستورات مخرب به عنوان پارامترهای ارسالی برای دیتابیس (معمولاً از طریق URL) ارسال میشوند. به طور مثال، در حملات SQL Injection، با استفاده از این مکانیسم، دستورات به طور مستقیم به دیتابیس یک برنامه ارسال شده و منجر به ایجاد تغییر در دادههای ثبت شده در دیتابیس میشود (برای آشنایی بیشتر با مفهوم SQL Injection، توصیه میکنیم به مقالهٔ آشنایی با مفهوم SQL Injection در زبان PHP مراجعه نمایید.) کراس سایت اسکریپتینگ (XSS) نیز با استفاده از همین اصل، به هدف قرار دادن کاربران پرداخته و آنها را فریب میدهد تا یک عمل مخرب که مد نظر مجرم سایبری است را انجام دهند (برای آشنایی با اصطلاح XSS نیز میتوانید به مقالهٔ آشنایی با مفهوم XSS و جلوگیری از آن در زبان برنامه نویسی PHP مراجعه نمایید.)
روی هم رفته، SQL Injection و XSS دو مورد از رایجترین آسیبپذیریهای نرمافزارهای تحت وب میباشند که برای مقابله با آنها، باید به دقت از درستی دادههای ورودی کاربران اطمینان حاصل کنیم که به این کار اصطلاحاً Sanitise Data گفته میشود (علاوه بر SQL Injection و XSS، نوع دیگری آسیبپذیری برای وب اپلیکیشنها وجود دارد تحت عنوان XPATH Injection که برای آشنایی با این مقوله، میتوانید به مقالهٔ آشنایی با مفهوم XPATH Injection در اپلیکیشنهای تحتوب مراجعه نمایید.)
مدیریت سِشِن
برنامههای کاربردی تحت وب غالباً نسبت به حملات مرتبط با اصطلاحاً Session Management آسیبپذیر هستند، به طوری که از این طریق، مجرمین سایبری با ربودن سِشِن کاربری که به درستی لاگین کرده است، کلیهٔ دسترسیها و هویت آن کاربر را از آنِ خود میکنند.
برای محافظت در برابر این نوع حملات، بایستی کوکیها را تست کرد تا عاری از هرگونه اطلاعات حساس باشند؛ علاوه بر این، هر کاربری میبایست دارای یک اصطلاحاً Session Id منحصربهفرد بوده که به طور رَندم (تصادفی) پس از لاگین موفق، به ازای هر کاربر تولید شود.
انتقال اَمن دیتا
یک بخش ضروری از تأمین امنیت نرمافزارهای تحت وب، حفاظت از اطلاعات حساس تحت هر شرایطی است. بسیاری از سازمانها اهمیت امنیت مسیری که دادهها از آن طریق در بستر وب انتقال مییابند را نادیده میگیرند و به درستی اطلاعات خود را رمزنگاری نمیکنند که در نتیجه در برابر رمزگشایی اطلاعاتشان توسط مجرمین سایبری، آسیبپذیر خواهند بود (برای کسب اطلاعات بیشتر پیرامون رمزنگاری، به مقالهٔ چه تفاوتهایی میان Encryption و Hashing وجود دارد؟ مراجعه نمایید.)
به طور کلی، انتقال امن دیتا از دو بخش تشکیل شده است که عبارتند از «شناسایی داده برای رمزگذاری» و «استفادهٔ درست از رمزگذاری» که در ادامه بیشتر با این موارد آشنا خواهیم شد:
- شناسایی داده برای رمزگذاری: رمزگذاری هزینهٔ زمانی در اجرای برنامهها دارد؛ به عبارت دیگر، منجر به ایجاد تأخیر در پردازش میشود و به همین دلیل تنها باید برای دادههای بسیار مهم و ضروری مورد استفاده قرار گیرد. برای این کار، لازم است تا به توسعهٔ زیرساختی برای تحلیل و اولویتبندی حساسیت دادهها بپردازیم؛ به عبارت دیگر، میبایست دستورالعملی ایجاد کنیم تا بر آن اساس، مشخص شود که چه دادههایی باید رمزگذاری شوند و چه دادههایی دستنخورده باقی بمانند.
- استفادهٔ درست از رمزگذاری: اکثر مواقع، عملیات رمزگذاری بسیار ضعیف اجرا میشود، پس باید مطمئن شویم که تمام دادههای حساس، از جمله یوزرنیم و پسورد رمزگذاری شده و الگوریتم مورد استفاده برای آنها به صورت رَندم و با امنیت بالا انجام شود (لازم به ذکر است الگوریتمی همچون SHA1 گزینهٔ خوبی برای این کار نیست؛ برای کسب اطلاعات بیشتر پیرامون این موضوع، به مقالهٔ استفاده از الگوریتم SHA-1 ممنوع چراکه گوگل توانست آن را بشکند! مراجعه نمایید.)
آنچه در بالا بدانها اشاره شد، صرفاً اصلیترین تمهدیداتی است که برای نرمافزارهای تحت وب میتوان اتخاذ نمود و اصلاً نیاز به توضیح نیست که پیادهسازی امنیت وب اپلیکیشنها، فرایندی به مراتب پیچیدهتر و کاملاً زمانبَر است.