حداقلهای امنیت نرمافزار: ۱۰ موردی که هیچ پروژهای نباید بدون آن تحویل شود
امنیت نرمافزار فقط مخصوص بانکها نیست. ده اصل پایهی امنیت وباپلیکیشن و سایت، از HTTPS و رمزنگاری رمز عبور تا پشتیبانگیری، به زبان ساده.
«سایت ما کوچک است، کسی کاری با آن ندارد.» این یکی از پرهزینهترین تصورات در دنیای نرمافزار است. بیشتر حملهها هدفمند نیستند؛ رباتهای خودکار هر روز میلیونها سایت را برای پیدا کردن ضعفهای شناختهشده اسکن میکنند و برایشان فرقی نمیکند سایت شما کوچک باشد یا بزرگ. خبر خوب این است که بخش بزرگی از این خطرها با رعایت چند اصل پایه از بین میروند.
۱. HTTPS همهجا
تمام ارتباط کاربر با نرمافزار باید رمزنگاریشده باشد، نه فقط صفحهی ورود. HTTPS امروز رایگان است (مثلاً با Let's Encrypt)، بر رتبهی سایت در گوگل اثر مثبت دارد و بسیاری از قابلیتهای مرورگر، مثل ضبط صدا، دوربین و PWA، بدون آن اصلاً کار نمیکنند.
۲. رمزهای عبور هرگز بهصورت خام ذخیره نشوند
رمز کاربران باید با الگوریتمهای مخصوص این کار مثل Argon2 یا bcrypt «هش» شود. در این حالت حتی اگر پایگاه داده لو برود، رمزها قابل خواندن نیستند. ذخیرهی رمز بهصورت متن ساده یا با الگوریتمهای قدیمی مثل MD5 یک اشتباه جدی است، چون کاربران معمولاً یک رمز را در چند جا استفاده میکنند.
۳. به هیچ ورودیای اعتماد نکن
هر چیزی که از بیرون وارد نرمافزار میشود، از فرمها و آدرس صفحه تا فایلهای آپلودی، باید در سمت سرور اعتبارسنجی شود. اعتبارسنجی فقط در مرورگر کافی نیست، چون بهراحتی دور زده میشود. دو حملهی کلاسیک که از همینجا شروع میشوند:
- تزریق SQL: وقتی ورودی کاربر مستقیم داخل دستور پایگاه داده قرار میگیرد. راهحل: استفادهی همیشگی از کوئریهای پارامتری.
- XSS: وقتی متن کاربر بدون پاکسازی در صفحه نمایش داده میشود و میتواند کد اجرا کند. راهحل: escape کردن خروجی بهصورت پیشفرض و استفاده از سیاست امنیت محتوا (CSP).
۴. کلیدها و رمزها بیرون از کد
رمز پایگاه داده، کلید درگاه پرداخت و توکن رباتها نباید داخل کد نوشته شوند یا در مخزن Git قرار بگیرند. جای آنها متغیرهای محیطی یا ابزارهای مدیریت اسرار است. رباتهایی وجود دارند که مخزنهای عمومی را برای پیدا کردن همین کلیدها میگردند. اگر کلیدی لو رفت، باید فوراً باطل و جایگزین شود؛ پاک کردنش از کد کافی نیست.
۵. کمترین دسترسی لازم
هر کاربر، هر سرویس و هر بخش از نرمافزار فقط باید به همان چیزی دسترسی داشته باشد که واقعاً لازم دارد. اپراتور پشتیبانی نیازی به حذف کاربران ندارد و نرمافزار نیازی ندارد با کاربر مدیر کل پایگاه داده وصل شود. دسترسیها باید در سمت سرور بررسی شوند؛ پنهان کردن یک دکمه در ظاهر صفحه امنیت نیست.
۶. محدودیت تعداد درخواست (Rate Limiting)
صفحهی ورود، فرمهای ثبت و ارسال کد تأیید باید محدودیت تعداد درخواست داشته باشند. بدون آن، مهاجم میتواند هزاران رمز را امتحان کند، صندوق پیامکتان را خالی کند یا با انبوه درخواست سرور را از کار بیندازد.
۷. بهروز نگه داشتن وابستگیها
نرمافزارهای امروزی روی دهها یا صدها کتابخانهی آماده ساخته میشوند و در این کتابخانهها مرتب ضعف امنیتی کشف و وصله میشود. ابزارهایی مثل npm audit یا Dependabot این ضعفها را خودکار گزارش میکنند. نرمافزاری که سالها بهروز نشده، معمولاً ضعفهای شناختهشدهی زیادی دارد.
۸. پشتیبانگیری منظم و تستشده
پشتیبان آخرین خط دفاع شماست: در برابر حمله، خطای انسانی و خرابی سختافزار. قاعدهی شناختهشدهی ۳-۲-۱ میگوید: سه نسخه از داده، روی دو نوع رسانهی متفاوت، که یکی از آنها بیرون از محل اصلی باشد. و از همه مهمتر: بازگردانی پشتیبان را بهصورت دورهای واقعاً امتحان کنید.
۹. لاگ و هشدار، بدون افشای اطلاعات
ورودهای ناموفق، تغییر دسترسیها و خطاهای مهم باید ثبت شوند تا اگر اتفاقی افتاد بتوانید بفهمید چه شد. در عین حال، لاگها نباید رمز، کد تأیید یا اطلاعات کارت را ذخیره کنند. پیامهای خطایی هم که به کاربر نشان داده میشوند نباید جزئیات فنی سیستم را افشا کنند.
۱۰. تنظیمات امن پیشفرض
حالت دیباگ در نسخهی نهایی خاموش باشد، رمزهای پیشفرض عوض شوند، پنل مدیریت آدرس و محافظت مناسب داشته باشد، کوکیهای نشست با ویژگیهای HttpOnly، Secure و SameSite تنظیم شوند و هدرهای امنیتی مرورگر فعال باشند. اجرای برنامه با کاربر غیرمدیر (non-root) در سرور یا کانتینر هم دامنهی آسیب را در صورت نفوذ کوچک میکند.
منبع معتبر برای ادامه: OWASP Top 10
بنیاد OWASP یک سازمان غیرانتفاعی است که فهرست ده خطر مهم امنیتی وباپلیکیشنها را بهصورت دورهای منتشر میکند. این فهرست زبان مشترک متخصصان امنیت است و اگر تیم سازندهی شما با آن آشنا نیست، جای نگرانی دارد.
جمعبندی
امنیت کامل وجود ندارد، ولی امنیت کافی برای بیشتر پروژهها با همین ده مورد به دست میآید. نکتهی کلیدی این است که این موارد از روز اول ساخت رعایت شوند؛ اضافه کردن امنیت به یک نرمافزار آماده همیشه سختتر و گرانتر از ساختنش از ابتداست. هنگام تحویل پروژه هم میتوانید این موارد را در کنار چکلیست تحویل نرمافزار بررسی کنید.